En UNIX existen expresiones o estamentos que se pueden usar en la línea de comandos y que pueden ejecutar una acción u otra dependiendo de ciertas condiciones, o ejecutar una tarea un número de veces determinado. Las expresiones más habituales son:
ASIGNACION: Asigna un valor (numérico o cadena de caracteres) a una variable.
VARIABLE = valor
MANIPULACION DE NUMEROS: Permite realizar las operaciones básicas con números:
VARIABLE = ´expr objeto1 [operacion] objeto2´
((VARIABLE=objeto1 [operacion] objeto2))
let "VARIABLE = objeto1 [operacion] objeto2"
donde objeto1 y objeto2 pueden ser núneros o variables numéricas. La forma ((...)) y let son equivalentes, y son del orden de 30 a 60 veces más rápidas que la forma expr.
Las operaciones aritméticas válidas, en orden de prececedencia se reflejan en la siguiente tabla:
| Operaciones | Significado |
|---|---|
| - | menos unario |
| ! | negación logica |
| ~ | negación bitwise |
| *, /, % | multiplicación, división, resto (modulo) |
| +, - | suma, resta |
| <<, >> | left shift, right shift |
| <=, < | menor o igual que, menor que |
| >=, > | mayor o igual que, mayor que |
| == | igual |
| != | distinto |
| & | AND bitwise AND |
| ^ | XOR o OR exclusivo bitwise |
| | | OR bitwise |
| && | AND logico |
| || | OR logico |
| = | asignación |
| *=, /=, %= | asignación multiplicación, asignación división, asignación modulo |
| +=, - | incremento, decremento |
| <<=, >>= | asignación left shift, asignación right shift |
| &=, ^=, |= | asignación AND bitwise, asignación XOR bitwise, asignación OR bitwise |
| (...) | agrupación (empleada para evitar las reglas de precedencia naturales) |
TEST: Prueba si es cierta una condición, devolviendo TRUE (0) o FALSE (1):
test condicion
En la condición, para comparar se utilizarán los siguientes operadores:
IF: Si condicional. Si la condición que se prueba es cierta se realiza una acción o acciones, y si es falsa se realizan otras.
if condicion then acciones else otras acciones fi
CASE: En caso de que una variable tome un valor hacer una acción, en caso de que tome otro otra, etc. Equivale a varios if anidados.
case variable in valor_1) accion 1; accion 2;; valor_2) accion 3;; *) accion;; esac
WHILE: Mientras se cumpla la condición especificada se ejecutarán las acciones contenidas en el interior del bucle.
while condicion do acciones done
UNTIL: Las acciones especificadas se ejecutarán hasta que se cumpla la condición. Until se puede utilizar como la negación de la condición de while.
until condicion do acciones done
FOR: Para la lista de argumentos dada, ejecutará el contenido del bucle.
for i in lista do acciones done
FUNCIONES: Se emplean para realizar tareas que tengan cierta entidad por si solas y que se ejecuten más de una vez. Permiten reutilizar código y ahorrar líneas de programa, a la vez que reducen el tamaño del programa. Se declaran del siguiente modo:
function nombre ()
{
acciones;
}
nombre ()
{
acciones;
}
Para llamarlas solo habrá que utilizar su nombre seguido de los posibles argumentos (como si se llamara a un programa más):
Nombre_Funcion argumento1 argumento2
Una función puede llamar a otras funciones o programas, o llamarse a si misma (recursividad). En el caso de usar funciones que se llamen a si mismas, o funciones recursivas, hay que tener especial cuidado con las condiciones de salida, con el fin de no entrar en un bucle infinito.
Veamos un par de ejemplos de funciones:
La función Hora muestra la hora del sistema las veces que se especifique o 5 si no se especifica dicho número.
function Hora
{
if [ $1 ]
then
VECES=$1
else
VECES=5
fi
while $ VECES -gt 0
do
date
((VECES =$ VECES - 1))
sleep 1
done
}
La funci%oacute;n ffind buscará todos los subdirectorios del directorio en que nos encontremos, y para cada uno de los archivos contenidos en ellos buscará la cadena que especifiquemos en la línea de comandos.
ffind ()
{
if [ $1 ]
then
DIRECTORIOS=$(find . -depth -type d -print 2>/dev/null)
for DIR in $DIRECTORIOS
do
grep $1 $DIR/*
done
fi
}
Las funciones pueden definirse dentro de un shell script, en cuyo caso solo son accesibles desde ese shell script, o bien en archivos independientes (ejecutables) que sean invocados desde los shell scripts mediante una orden del tipo ". /directorio/archivo_funciones". También se puede ubicar una función por archivo (con el mismo nombre que la función) y todos los archivos de funciones en un directorio (que solo contendrá archivos de funciones) que se indicará en la variable de entorno FPATH (export FPATH=/usuario/dir_funciones). En este último caso las funciones serán accesibles desde la línea de comandos y cualquier shell script que las utilice si el usuario tiene correctamente definida la variable FPATH.