Apunte de programación en bash Variables Asignación: La asignación de variables se realiza simplemente indicando su nombre, un signo =, y el valor, como en el siguiente ejemplo: nombre=”Luis” Valor: El valor de una variable se toma anteponiendo un signo $ al nombre, así si queremos imprimir el valor de la variable nombre que creamos antes: echo $nombre Entradas/Salidas (I/O) La entrada salida puede manejarse con los comandos echo y read: echo $variable echo -n “Esto no imprime un carácter nueva línea al final” read ciudad read ciudad calle nro Este último ejemplo lee 3 valores desde el teclado, tomando como separador el estándar definido para el shell (usualmente el espacio). Los valores van a las variables que se están leyendo ($ciudad, $calle y $nro). Si se desea dirigir a pantalla múltiples líneas de texto, puede utilizarse un truquito con el comando cat: #!/bin/bash cat << IMPRIMIRHASTAAQUI Esto es un ejemplo de un texto realmente largo que debemos sacar por pantalla hasta llegar al punto indicado en el comando cat de arriba IMPRIMIRHASTAAQUI …sigue el script… Página 1 de 5 Argumentos Los argumentos que se pasan en el momento de invocar el script se asignan a las variables automáticas $1, $2, $3, etc... script perro gato loro $1 vale perro, $2 vale gato, $3 vale loro. En ocasiones se desea asignar a una variable el valor obtenido mediante la ejecución de otro comando. Esto se logra encerrando el comando entre ' como se vé en el siguiente ejemplo: horaydia='date' Otras variables automáticas son $0 que contiene el nombre del script, y $# que contiene la cantidad de argumentos ingresados durante la ejecución del script. Expresiones El comando test permite evaluar expresiones devolviendo verdadero o falso como resultado (usualmente se utiliza con el comando if): test “$nombre” = “Luis” El ejemplo de arriba chequea igualdad. Si deseamos chequear desigualdad debemos usar el operador != como en C: test “$nombre” != “Carlos” Otros operadores son: test $variable Chequea si la variable contiene algún dato, en cuyo caso devuelve verdadero. test -z $variable Chequea si la variable no contiene datos (longitud cero), en cuyo caso devuelve verdadero. test $variable1 -eq $variable2 Chequea igualdad entre variables numéricas enteras, si son iguales devuelve verdadero. test $variable1 -ge $variable2 Chequea si el primer valor es mayor o igual que el segundo, en cuyo caso devuelve verdadero. test $variable1 -gt $variable2 Chequea si el primer valor es mayor que el segundo, en cuyo caso devuelve verdadero. Página 2 de 5 test $variable1 -le $variable2 Chequea si el primer valor es menor o igual que el segundo, en cuyo caso devuelve verdadero. test $variable1 -lt $variable2 Chequea si el primer valor es menor que el segundo, en cuyo caso devuelve verdadero. test $variable1 -ne $variable2 Chequea que los dos valores no sean iguales, en cuyo caso devuelve verdadero. test $archivo1 -nt $archivo2 Chequea las fechas de modificación de dos archivos, devolviendo verdadero si el archivo1 es más nuevo que el archivo2. test -f $archivo Chequea si el archivo existe, en caso afirmativo devuelve verdadero. test -d $archivo Chequea si el archivo en cuestión es un directorio y si existe, en cuyo caso devuelve verdadero. test –r $archivo Chequea si tenemos permiso de lectura sobre el archivo, devolviendo verdadero en caso afirmativo. test –w $archivo Chequea si tenemos permiso de escritura sobre el archivo, devolviendo verdadero en caso afirmativo. test –x $archivo Chequea si tenemos permiso de ejecución sobre el archivo, devolviendo verdadero en caso afirmativo. test –b $archivo Chequea si el archivo es un block device, devolviendo verdadero en caso afirmativo. test –c $archivo Chequea si el archivo es un character device, devolviendo verdadero en caso afirmativo. Evaluando el resultado de un comando Dado que los comandos que se ejecutan con éxito devuelven un código de ejecución equivalente a verdadero, mientras que los que fallan devuelven un código de ejecución equivalente a falso, podemos evaluar directamente el resultado de un comando como en el siguiente ejemplo: grep “$nombre” /etc/passwd > /dev/null Si el usuario existe el resultado será verdadero, de lo contrario será falso. El '> /dev/null' es para evitar la salida del grep por pantalla. Página 3 de 5 Condicionales y ciclos if ... then ... else ... fi if test “$nombre” = “Luis” then echo “Hola Luis” else echo “Fuera de aquí!” fi && (permite un if...then rápido, en realidad es un AND lógico) test “$nombre” = “Luis” && echo “Hola Luis!” || (similar al anterior pero para el caso falso, en realidad es un XOR lógico) test “$nombre” = “Luis” || echo “Ud. no es Luis!” case ... in ... esac case $nombre in Luis) echo “Hola Luis, como va todo?” ;; Carlos) echo “Hola Carlos!” ;; Pepe) echo “Despertate Pepe!!!” ;; *) echo “no tengo idea de quién es Ud.” esac while ... do ... done nombre=”Lorenzo” while test “$nombre” = “Lorenzo” do echo -n “Ingrese su nombre, Lorenzo es inaceptable: “ read nombre done until ... do ... done until test “$nombre” = “Lorenzo” do echo -n “Ingrese su nombre, Lorenzo es inaceptable: “ read nombre Página 4 de 5 done for ... in ... do ... done for nombrearchivo in *html do echo -n “El archivo: $nombrearchivo contiene “ wc -l $nombrearchivo done Ese programa recorre todos los archivos con extensión html en el directorio actual, y cuenta las líneas en cada uno de ellos. Cómo evitar que salgan falsos positivos en el grep ps aux | grep httpd | grep -v grep > /dev/null El ps aux lista todos los procesos. El primer grep filtra todas las líneas que contienen httpd, pero por desgracia baja la línea grep httpd que estamos ejecutando. Por esto el segundo grep inverso, para mostrar las líneas que no contienen la palabra grep. Finalmente enviamos todo a /dev/null para evitar que salga por pantalla. Página 5 de 5