Apunte de programación en bash Variables Entradas/Salidas (I/O)

Anuncio
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
Descargar