Operadores Especiales y Funciones en Scripts de UNIX: Optimización y Ejemplos

Clasificado en Informática

Escrito el en español con un tamaño de 5,26 KB

Operadores Especiales en Scripts de UNIX

Operador $?

El operador $? permite ver el código de salida que el sistema operativo ha devuelto en la orden anteriormente ejecutada.

Ejemplo:


#!usr/bin/sh
grep $LOGNAME /etc/passwd > mio.txt 2>/dev/null
if [ $? -eq 0 ]; then
  echo "Estoy aquí"
fi

Este script busca el nombre de usuario actual ($LOGNAME) en el archivo /etc/passwd. La salida estándar se redirige al archivo mio.txt, y cualquier error se redirige a /dev/null. Si la ejecución del comando grep es exitosa (código de salida 0), se imprime "Estoy aquí".

También se puede pasar un argumento al script:


#!usr/bin/sh
grep $1 /etc/passwd > mio.txt 2>/dev/null
if [ $? -eq 0 ]; then
  echo "Estoy aquí"
fi

En este caso, $1 representa el primer argumento posicional pasado al script. Por ejemplo, $ miguion pepe buscaría el usuario "pepe" en /etc/passwd.

Operador $$

El operador $$ representa el identificador de proceso (PID) actual del script.

Ejemplo:


#!usr/bin/sh
find / -size $1 > lista.txt 2>/dev/null

Este script busca archivos con un tamaño en bloques especificado por el primer argumento posicional ($1), comenzando en el directorio raíz (/). La salida se redirige a lista.txt, y los errores a /dev/null. Por ejemplo, $ miguion 256 buscaría archivos de 256 bloques.

Para evitar conflictos si dos usuarios ejecutan el script simultáneamente, se puede usar $LOGNAME en el nombre del archivo de salida. Además, para diferenciar búsquedas del mismo usuario, se puede usar $$:


find / -size $1 > /lista.$LOGNAME.$$

Comando xargs

El comando xargs permite utilizar la salida de un comando como argumentos para otro comando. Combina su entrada estándar con los argumentos iniciales y ejecuta el comando resultante.

Sintaxis:


xargs [indicadores] [orden [argumentos iniciales]]

Indicadores útiles:

  • -i: Cada línea de la entrada estándar se toma como un argumento único que se sustituye por {} en el comando resultante.
  • -p: Solicita confirmación antes de ejecutar cada comando.

Ejemplo de uso de xargs para mover archivos:


#!/usr/bin/sh
if [ -d $1 -a -d $2 ]; then
  ls -1 $1 | xargs -p -i mv $1/{} $2/{}
fi

Este script mueve archivos del directorio especificado en $1 al directorio en $2, siempre que ambos sean directorios válidos. Por ejemplo, $ mover d1 d2 movería los archivos de d1 a d2, mostrando una confirmación para cada archivo.

Definición de Funciones en Scripts de Shell

Las funciones son conjuntos de comandos agrupados bajo un nombre. Permiten reutilizar código y mejorar la organización del script.

Sintaxis

Hay dos formas de definir funciones:

  • Implícita:
          
          NombreFuncion() {
            comandos
          }
          
        
  • Explícita:
          
          function NombreFuncion() {
            comandos
          }
          
        

Las funciones se ejecutan en la shell actual y permanecen en memoria, lo que evita accesos a disco en cada llamada.

Ubicación de las Funciones

Las funciones se pueden definir:

  1. En el mismo script donde se utilizan, generalmente al principio.
  2. En un archivo separado que contenga varias funciones.

Invocación de Funciones

Para invocar una función, simplemente se escribe su nombre.

Ejemplo:


#!/usr/bin/ksh
mensaje() {
  echo "Dentro. Son las $(date)"
}
echo "Antes"
mensaje
echo "Después"

Salida:


$ chmod 755 miscript
$ miscript
Antes
Dentro. Son las ...
Después

Variables y Ámbito

Las variables modificadas dentro de una función tienen un alcance global en el script. No existen variables locales por defecto. Una función puede terminar con la sentencia return, que devuelve 0 (verdadero) o 1 (falso).

Paso de Parámetros a Funciones

Las funciones pueden recibir parámetros de forma similar a los scripts. Los parámetros no se especifican en la cabecera de la función. Al terminar la ejecución de la función, los argumentos del script principal son sobrescritos por los de la función. Se recomienda guardar los argumentos del script principal antes de llamar a la función:


_M1=$1
_M2=$2

Solo se pueden utilizar 9 argumentos (de $1 a $9) dentro de la función.

Ejemplo:


if procesar $MIARCHIVO; then
  echo "OK"
else
  echo "MAL"
fi

En este ejemplo, la función procesar recibe $MIARCHIVO como argumento. El resultado de la función se utiliza en la condición del if.

Entradas relacionadas: