- Estréllate y Arde - https://www.estrellateyarde.org -
Manual de Bash: lo más básico
Al shell Bash, el intérprete de comandos estándar en Linux, le podemos pasar comandos desde una terminal o desde un script, que es un archivo de texto que contiene un pequeño programa.
El script más sencillo es Hola mundo. Veamos cómo crearlo:
#!/bin/bash echo "Hola, mundo."
$ chmod a+x hello.sh
$ ./hello.sh
También podemos ejecutar el script llamando a bash:
$ bash hello.sh
En ambos casos obtendremos por la salida estándar (la pantalla) lo siguiente:
Las líneas que comienzan por el carácter "#" (excepto la primera), se consideran comentarios y son ignoradas por el intérprete de comandos.
A un script se le pueden pasar argumentos.
Veamos por ejemplo el siguiente script, llamado args.sh:
#!/bin/bash echo "\$0 contiene $0" echo "\$1 contiene $1" echo "\$2 contiene $2" echo "En total hay $# parametros"
Ejecutamos este script sin pasarle argumentos:
$ ./args.sh $0 contiene ./args.sh $1 contiene $2 contiene En total hay 0 parametros
Ahora ejecutamos el script pasándole dos argumentos:
$ ./args.sh buenos dias $0 contiene ./args.sh $1 contiene buenos $2 contiene dias En total hay 2 parametros
Veamos un ejemplo de script al que se le pasa sólo un parámetro. El comando de borrar de Linux rm no pide confirmar la operación de borrado si no se le pone la opción "-i". Esto es peligroso porque uno fácilmente puede olvidarse de teclear dicha opción y borrar lo que no quería borrar. Vamos a crear un script llamado del.sh que incluya dicha opción. Dicho archivo podría ser:
#!/bin/bash echo "Quiere borrar el archivo $1?" rm -i $1
Después de darle a este archivo el correspondiente permiso de ejecución con el comando chmod, podríamos borrar con confirmación el archivo file1 tecleando:
$ del.sh file1
Dentro del archivo de comandos, $0 valdría del y $1 valdría file.
Veamos ahora un script al que se le pasan dos parámetros. El programa cambio.sh intercambia el nombre de dos archivos:
#!/bin/bash mv $1 archivotemp mv $2 $1 mv archivotemp $2
Para ejecutar este programa haremos:
$ cambio.sh file1 file2
En este ejemplo $0 es cambio.sh, $1 es file1 y $2 es file2.
Veamos un ejemplo con mútiples argumentos. Si el programa del.sh que hemos hecho previamente lo hubiéramos utilizado en la forma:
$ del.sh *.f
teóricamente debería borrar, con confirmación, todos los archivos Fortran del directorio (*.f). En la práctica no es así, porque $1 sólo almacena el primer archivo Fortran y es el único que borra. Para borrar todos el script del.sh podría ser:
#!/bin/bash echo "Hay # programas para borrar \n" rm -i *
El comando para terminar el script es exit. Este comando no es útil al final del script, pero sí para terminar el programa en algún punto intermedio, por ejemplo "si se da tal condición, entonces terminar". Además, el comando exit permite establecer el valor de retorno, el valor devuelto por el script.
Cuando se ejecuta un programa o comando devuelve un valor numérico, que será:
El valor de retorno no se imprime por la pantalla, es decir, cuando un programa termina no saca por pantalla un cero u otro número, sino que el valor de retorno del último programa ejecutado queda almacenado en la variable especial $?.
Veamos un ejemplo:
#!/bin/bash echo "Listando archivo existente..." ls archivo_existente echo "El valor de retorno fue: $?" echo " " echo "Listando archivo inexistente..." ls archivo_inexistente echo "El valor de retorno fue: $?"
Primero listamos un archivo existente: lo lista con éxito y por tanto el valor de retorno es 0. A continuación, listamos un archivo inexistente: como eso no es posible, el comando no termina con éxito y el valor de retorno es distinto de cero (en este caso 1).
Utilizaremos el valor de retorno para saber si los comandos del script han tenido éxito o no, pudiendo emplear esta información en sentencias condicionales.
El comando para terminar el script, exit, permite establecer el valor de retorno (el valor devuelto por el script), para así obtener información acerca de si el script ha tenido éxito o no y porqué. Por ejemplo:
#!/bin/bash if [ expresion1 ]; then Bloque 1 exit 0 else Bloque 2 exit 1 fi
Para que una variable definida dentro de una función, bucle o estructura sea de ámbito local (sólo existe en esa estructura) debemos declararla como local con el comando local:
local j=8
Las variables que no se definan expresamente como locales, se definan donde se definan, serán de ámbito global, y por tanto, accesibles en cualquier lugar del programa.
Para introducir datos por el teclado usaremos el comando read. Para ver cómo funciona, veamos el siguiente script:
#!/bin/bash frase="Introduzca lo que usted quiera:" echo $frase read entrada_del_usuario echo " " echo "Usted introdujo: $entrada_del_usuario"
Cuando se ejecute el script, al llegar al comando read esperará a que el usuario escriba algo y presione la tecla <INTRO>. A continuación, almacenará la entrada del usuario en la variable $entrada_del_usuario.
El comando que permite evaluar expresiones es test: el valor de retorno será cero (0) si la expresión es VERDADERO (TRUE), y uno (1) si la expresión es FALSO (FALSE). La sintaxis es:
test <expresion>
Veamos un ejemplo:
#!/bin/bash a=7 b=8 test $a -eq $a echo $? test $a -eq $b echo $?
Si ejecutamos el script obtendremos:
0 1
El primer comando quiere decir: ¿es $a igual a $a? Vemos que el valor de retorno es cero (0), lo cual indica que la expresión es VERDADERO: efectivamente $a es igual a $a. El segundo comando comprueba si $a igual a $b: el valor de retorno de test es uno (1), ya que la expresión es FALSO: $a no es igual a $b.
Existe otra sintaxis para evaluar una expresión, algo más clara:
[ expresion ]
Veamos un ejemplo:
#!/bin/bash a=7 b=8 [ $a -eq $b ] echo $?
Si ejecutamos el script obtendremos:
1
Algunos de los operadores que admite test son:
[ integer1 -eq integer2 ]
[ string1 = string2 ], [ -z string1 ]
[ file1 -nt file2] , [ -e file1 ]
Article printed from Estréllate y Arde: https://www.estrellateyarde.org
URL to article: https://www.estrellateyarde.org/discover/programar-bash-lo-mas-basico
Click here to print.
Copyright © 2010 Estrellate y Arde