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:
- En el mismo script donde se utilizan, generalmente al principio.
- 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
.