Javier Barber
Senior Sysadmin Freelancer
SOBRE BASH
La variable $? contiene el resultado de la ejecución del último comando. (0 si ha sido correcto o 1 si ha habido error).
Con una contrabarra escapamos de algo en la ejecución de un comando. Por ejemplo:
echo «\$0» escribiria por pantalla $0 en vez del contenido de la variable (Nombre del script en este caso).
$$ Contiene el PID de la BASH
$0 Contiene el nombre del script
$1…$9 Parametros del script
$# Numero de parametros que pasamos al script
$* Contiene todos los parametros separados por espacios
$@ Contiene un array con todos los argumentos pero por posicion
Para almacenar el valor de una variable usamos el comando read:
read variable
Podemos leer varias variables separadas por espacios:
read variable1 variable2
Para guardar el resultado de la ejecución de un comando en una variable podemos meter el comando entre comillas invertidas o bien dentro de $(…). Por ejemplo:
prueba=`ls -l | wc -l` o prueba=$(ls -l | wc -l)
El asterisco sirve de comodín y el signo ? se usa para un caracter solamente:
ls pr?eba
ls ? (Archivos de una sola letra)
ls ?? (Archivos de dos letras)
Podemos hacer listas de caracteres:
ls [a,b]* (Ficheros que empiecen por a ó b)
ls [!z] (Ficheros que no empiecen por z).
Con el simbolo ‘<‘ podemos usar un archivo como entrada de un comando:
sort < lista_sin_ordenar
Descriptores de ficheros: 0 – Entrada estandar, 1 – Salida estandar y 2 – Error estandar.
$ cat fichero_inexistente 2&>errores
Si usamos la opcion -e con el echo le indicamos que interprete los caracteres de control que encuentre:
echo -e «hola \n adios»
Codigo de escape y resultado:
\e Envia un caracter de escape (esc)
\a Envia un caracter de timbre (bell)
\b Envia un caracter de retroceso (backspace)
\f Envia un caracter de avance de forma
\n Envia un caracter de retorno de carro (
\r Envia un caracter de avance de linea (
\t Envia un caracter de tabulacion (Tab)
\v Envia un caracter de tabulacion vertical
\’ Envia un caracter de coma simple
\\ Envia el caracer de diagonal inversa (\)
\c Mantiene el cursor en la misma linea
La evaluación de expresiones se realiza o bien encerrando la expresión entre corchetes o bien con la expresión test:
[ $var -eq 1 ]
test $var -eq 1
Las opciones permitidas para expresiones numéricas son:
-lt Menor que
-eq Igual que (Para cadenas usamos el signo ‘=’)
-gt Mayor que
-le Menor o igual que
-ge Mayor o igual que
-ne No coinciden
-a
Operador lógico and
exp1 -a exp2 . (&&)
-o
Operador lógico or
exp1 -o exp2 . (||)
-d archivo archivo es un directorio
-e archivo archivo existe
-f archivo archivo es un archivo ordinario
-r archivo archivo es leible por el proceso
-s archivo archivo tiene longitud mayor a
-w archivo archivo es escribible por el proceso
-x archivo archivo es ejecutable
-L archivo archivo es una liga simbolica
-n valor valor no es nulo
-z valor valor es nulos
Para negar expresiones usamos el !:
[ ! -r «/etc/shadow» ]
Las expresiones aritmeticas se realizan con:
$((expresion))
$((i=(i+10) * j))
resultado=$(( i >0 && i <=100 )) (Resultado valdra 0 o 1)
Los arrays en bash tienen la siguiente sintaxis:
nombre[indice]=valor
$ FRUTA[0]=manzana
$ FRUTA[1]=pera
$ FRUTA[2]=naranja
$ echo ${FRUTA[0]}$ FRUTA[primera]=manzana
$ FRUTA[segunda]=pera
$ FRUTA[tercera]=naranja$ FRUTA=(manzana pera naranja)
Es equivalente a:
$ FRUTA[0]=manzana
$ FRUTA[1]=pera
$ FRUTA[2]=naranja$ echo ${computadoras[@]} Accede a todos los elementos
$ echo ${computadoras[*]} Accede a todos los elementos
Para enviar el proceso a background, utilizamos el comando bg:
$ sleep 500
^Z
[6]+ Stopped sleep 500
$ bg
[6]+ sleep 500 &
Para crear un archivo podemos usar:
$ cat > archivoprueba
texto…
Podemos buscar una cadena dentro de un archivo con:
$grep cadena fichero
Sentencias de control:
if expresion ; then
sentencias
elif
sentencias
else
sentencias
ficase variable in
valor1) Sentencias
valor2) Sentencias
*) Sentencias
esacfor i in v1 v2 v3 v4; do
echo «Estas son las variables $i»
donewhile [ expresion ]; do
sentencias
break
doneuntil [ expresion ]; do
sentencias
done
Funciones:
function memf {
exec free | grep Mem | awk ‘{print $4}’ }