Bash Scripting¶
Los scripts de bash sirven sobre todo para automatización.
Ficheros Bash¶
Suelen acabar con la extensión .sh, aunque no es obligatorio. Lo que si es obligatorio es que empiecen con el shebang (comando que empieza por # en la primera linea del fichero) que indica como hay que ejecutar el fichero.
En entornos viejos probablemente haya que poner
Ejecución¶
Se pueden ejecutar desde la shell haciendo:
./<fichero>sh <fichero>bash <fichero>- Situándolo dentro de uno de los directorios especiales
/usr/local/bino/usr/bin
Deberían de tener permisos de lectura como de ejecución.
Variables¶
Las variables serían <variable>=<valor>, sin espacios en el igual. Existen diferentes tipos:
- String:
- El valor va entre comillas dobles
nombre="Paco Pepe".
- El valor va entre comillas dobles
- Numérica:
- Sin comillas y en un solo bloque
numero=1977.
- Sin comillas y en un solo bloque
- Array (lista):
- Valores entre paréntesis y separados por un espacio
lista=(Paco Pepe Hernandez). - Empiezan por la posición cero.
- Se accede a un elemento concreto usando corchetes
lista[0]="Paco". - Se pueden añadir elementos
lista[3]="Fernandez.
- Valores entre paréntesis y separados por un espacio
- Salida de comando:
- Se declara entre tildes invertidas `
fichero='cat fichero.sh'
- Se declara entre tildes invertidas `
Para poder usar una variable anteriormente definida, EXCEPTO LOS ARRAYS, se puede usar:
$->Mi nombre es $nombre.(())->((numero++))ó((numero=numero+1)).let ""->let "numero++"ólet "numero=numero+1.
Variable $?:
- Si se ha ejecutado un comando anterior, podemos recoger el valor que devuelve con esta variable.
- Si el comando se ha ejecutado sin problemas, devuelve 0.
- Si da algun problema, devuelve otro número / cosa.
- Para saber que devuelve el comando hay que mirar su man page ->
man <comando>.
- Para saber que devuelve el comando hay que mirar su man page ->
Arrays¶
- Declaración:
- Directamente ->
lista=(uno dos tres) - Poco a poco ->
lista=[0]="uno"; lista[1]="dos"; lista[2]="tres".
- Directamente ->
- Uso con
${}$lista-> Devuelve solo el primer elemento.$lista[3]-> Sigue devolviendo el primer elemento junto con las letras[3].${lista}-> Devuelve solo el primer elemento.${lista[3]}-> Devuelve el cuarto elemento.${lista[*]}-> Devuelve todo el array.${#lista[*]}-> Devuelve el número de elementos que contiene el array.${#lista[1]}-> Devuelve el número de elementos que tiene el segundo elemento del array.
- Borrar con
unset:unset lista[1]-> Borra el segundo elemento.unset lista-> Borra todo el array.
Sintaxis¶
- No es obligatorio con las tabulaciones.
- Si es muy porculero con los espacios, sobre todo en condiciones, bucles, y demás.
- Los comentarios empiezan por
#. - Se pueden poner varias instrucciones por linea separándolas por
;. - La sentencia
set -udespués del shebang inicial ayuda a indicar errores de gramática (poner mal el nombre de una variable).
Operadores¶
- Operadores booleanes:
true.false.
- Operadores matemáticos:
+-> Suma.--> Resta.*-> Multiplicación./-> Division.%-> Módulo.
- Comparaciones lógicas:
-lt/-gt-> Menor (<) / mayor (>) que.-le/-ge-> Menor o igual (<=) / mayor o igual (>=) que.-eq/-ne-> Igual (==) / distinto (!=) que.z/n-> Nulo (ningún carácter) / no nulo (al menos un carácter).-aó&&-> AND.-oó||-> OR.
- Operadores condicionales de ficheros:
-e-> Si existe.-f-> Si existe y NO es un directorio.-d-> Si existe y NO es un fichero.-s-> Si existe y no está vacío.-r-> Si existe y tiene permisos de lectura.-w-> Si existe y tiene permisos de escritura.-x-> Si existe y tiene permisos de ejecución.
Argumentos de entrada¶
./<fichero> <arg1> <arg2> <arg3>
El argumento 0 sería el nombre del propio fichero. Los demás argumentos van separados por espacios. Dentro del fichero podemos usar los argumentos con:
$0-> Primer argumento (nombre del script).$1-> Segundo argumento.$...
Se pueden usar como un array:
$*-> Todos los argumentos en formato string (sin$0).$@-> Todos los argumentos en formato array (sin$0).$#-> Número de argumentos (sin$0).
Puedes leer argumentos interactivamente con read <variable>
#!/bin/bash
echo "Introduce tu nombre"
read nombre
read -p "Ahora el apellido" apellido
echo "Te llamas $nombre $apellido
exit¶
Existe un comando para salir de un script en un momento concreto y devolver un valor estimado.
exit 1 -> Saldría del script devolviendo 1.
exit -> Saldría del script devolviendo el valor de la variable $? de dentro del script.
if¶
Si la <condicion> es un string, deberías de poner [[ <condicion> ]] en lugar de [ <condicion> ].
case¶
case <variable> in
<opcion1>)
<comandos>
;;
<opcion2>|<opcion3>)
<comandos>
;;
<opcion4>)
<comandos>
;;
*)
<comandos>
esac
En las <opcion> podemos hacer lo siguiente, si quisiera que se leyera make o Make, haríamos que <opcion> sea [Mm]ake.
while¶
for¶
Se recomienda usar la @ en los arrays de los for en lugar de *. Ejemplo:
Recorrer ficheros externos¶
Con while leemos líneas:
Con for leemos palabras:
Un ejemplo, le paso sh ejemplo.sh mifichero.txt: