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.