Bash Scripting
Bash Scripting
1. Todo script debe comenzar con el "shebang", que indica al sistema el intérprete que
debe interpretar las líneas:
#!/bin/bash
2. Los comandos que hay en el script, son comandos que se podrían ejecutar en una
línea de comandos. La única diferencia, es que se pueden ejecutar secuencias de
comandos más complejas:
#!/bin/bash
echo "Un script de prueba"
NOTA: Los permisos 750 (rwxr-x---) indican que el archivo solo puede ser ejecutado por el
propietario y por los pertenecientes al grupo del propietario.
#!/bin/bash
variable="78345aas2wo2332"
echo "El contenido de la variable es el siguiente: "$variable
#!/bin/bash
echo "Introduce tu nombre: "
read nombre_persona
echo "Tu nombre es $nombre_persona"
#!/bin/bash
function ambito {
a="Variable local de la función ámbito"
echo "La variable \$a contiene: $a"
}
a="Variable global"
echo "La variable \$a contiene: $a"
echo "Ahora vamos a invocar la función ámbito:"
ambito
7. Con bash scripting se puede hacer toma de decisiones, con "if". Por ejemplo, "si existe
el archivo llamado 'miarchivo' entonces hacer esto o lo otro":
#!/bin/bash
echo "Escribe un nombre de archivo: "
read archivo
if [ -f $archivo ]; then
echo "El archivo existe"
else
echo "El archivo no existe"
fi
Operador Verdad si
-d archivo El archivo existe y es un directorio
-e archivo El archivo existe
-f archivo El archivo existe y es un archivo regular
- r archivo Tenemos permiso de lectura en el archivo
-s archivo El archivo existe y no está vacío
-w archivo Tenemos permiso de escritura
arch1 -nt El archivo "arch1" es más nuevo que "arch2"
arch2
arch1 -ot El archivo "arch1" es más antiguo que
arch2 "arch2"
#!/bin/bash
echo "Escribe un nombre de archivo: "
read archivo
if [ -r $archivo ] && [ -w $archivo ]; then
echo "El archivo es completamente accesible"
elif [ -r $archivo ]; then
echo "El archivo solo es accesible en lectura"
elif [ -w $archivo ]; then
echo "El archivo solo es accesible en escritura"
fi
#!/bin/bash
if [ $x -eq $y ]; then
echo "son iguales"
fi
Comparación Comando
x=y $x -eq $y
x != y $x -ne $y
x<y $x -lt $y
x <= y $x -le $y
x>y $x -gt $y
x >= y $x -ge $y
x no vacía -n $z
x vacía -z $x
10. Multiselección. Cuando hay varias opciones sobre las que tomar una decisón,
podemos utilizar "case":
#!/bin/bash
echo "Escribe un número"
read valor;
case $valor in
0) echo "valor es cero" ;;
1) echo "valor es uno" ;;
2) echo "valor es dos" ;;
3) echo "valor es tres" ;;
*) echo "valor es cuatro"
esac
Variable Significado
$1 Primer argumento
$2 Segundo argumento
$3 Tercer argumento
$# Contiene el número de argumentos.
$0 Nombre del script
#!/bin/bash
function mostrar_uso {
echo "INSTRUCCIONES DE USO: $0 dir_origen dir_destino"
exit 1
}
# Main program starts here
if [ $# -ne 2 ]; then
mostrar_uso
else # There are two arguments
if [ -d $1 ]; then
dir_origen=$1
else
echo 'Directorio origen no válido'
mostrar_uso
fi
if [ -d $2 ]; then
dir_destino=$2
else
echo 'Directorio destino no válido'
mostrar_uso
fi
fi
echo "El directorio origen es $dir_origen"
echo "El directorio destino es $dir_destino"
Canal Descriptor de
archivo
STDIN 0
STDOUT 1
STDERR 2
Los canales STDIN, STDOUT y STDERR son vistos por el sistema como archivos, por lo
que los símbolos "0<", "1>", "2>" y ">&" permiten redirigir los contenidos de STDIN,
STDOUT y STDERR. Por ejemlo:
find / -name core 2> /dev/null → Este comando no mostraría los mensajes
"permiso denegado".
13. Bucles for:
#!/bin/bash
sufijo=BACKUP--`date +%Y%m%d-%H%M`
for script in `ls *.sh`; do
nuevonombre="$script.$sufijo"
echo "Copiando $script a $nuevonombre..."
cp $script $nuevonombre
done
#!/bin/bash
exec 0<$1
### con la instrucción anterior, el STDIN proviene del primer
argumento.
contador=1
while read linea; do
echo "$contador: $linea"
((contador++))
done
#!/bin/bash
contador = 1
for elem in ${mi_array[@]}; do
echo " Elemento $contador = "$elem
((contador++))
done