6 Shell Scripting
6.1 Introducción
Shell scripting es una potente herramienta para automatizar tareas en Linux. Esta sección presenta los fundamentos de la creación y ejecución de scripts de shell utilizando el editor de texto nano.
Visión general:
- Aprender a escribir su primer script con comandos básicos.
- Comprender los permisos de ejecución y depuración de scripts.
- Explore la mejora de los scripts añadiéndolos a los comandos
$PATH
. - Manipular variables y realizar cálculos matemáticos.
- Manejar la entrada del usuario y la lógica condicional.
6.2 Escribir su primer script
Comience generando un nuevo archivo de script:
nano myscript.sh
Para tu script:
- Comience con
#!/bin/bash
para el intérprete. - Añadir
#
para comentarios.
Ejemplo de script básico:
#!/bin/bash
# Listar archivos y directorios
ls
Para guardar su script, utilice Ctrl + O
, and exit nano with Ctrl + X
.
6.3 Ejecución del script
Hacer ejecutable el script:
chmod +x myscript.sh
Ejecute el script:
./myscript.sh
Depurar el script:
bash -x myscript.sh
6.4 Añadir scripts a $PATH
Para ejecutar el script desde cualquier lugar:
export PATH=$PATH:/path/to/script
Después de esto, puedes ejecutar tu script simplemente escribiendo su nombre:
myscript.sh
6.5 Trabajar con variables
Para utilizar variables en el script:
#!/bin/bash
name="Alice"
echo $name
Para textos multilínea:
To print multi-line texts, use echo -e
and \n
for new lines:
#!/bin/bash
greeting="Hello\neveryone"
echo -e $greeting
6.6 Trabajar con comillas
En Bash, las comillas pueden alterar la interpretación del texto:
' '
: Comillas simples" "
: Comillas dobles` `
: Marcas
El comportamiento de las variables y comandos cambia en función de las comillas utilizadas:
6.6.1 Comillas simples
Uso de comillas simples:
message="Good morning"
echo 'El mensaje es: $mensaje'
Produce:
El mensaje es: $mensaje
Las comillas simples evitan la expansión de variables y tratan $mensaje
como texto literal.
6.6.2 Comillas dobles
Uso de comillas dobles:
message="Good morning"
echo "El mensaje es: $mensaje"
Produce:
El mensaje es Buenos días
Las comillas dobles permiten la expansión de variables, por lo que «$mensaje» se sustituye por su valor.
6.6.3 Marcas
Los backticks ejecutan el comando en su interior y capturan su salida:
message=`pwd`
echo "The working directory is: $message"
Produce un mensaje como:
The working directory is: /home/user
Marcas ejecuta el comando pwd
and assign its output to message
.
6.7 Captura de la entrada del usuario
El comando read
en los scripts Bash está diseñado para capturar la entrada del usuario y almacenarla en variables.
6.7.1 Uso básico
Simplemente use read
seguido de un nombre de variable para almacenar la entrada del usuario:
read name
En este ejemplo, la entrada del usuario se almacena en la variable name
.
6.7.2 Almacenamiento de entradas en múltiples variables
Puede capturar entradas en múltiples variables de esta forma:
read name var2 var3
Este comando espera una sola línea de entrada, que luego es dividida por espacios y almacenada en name
, var2
, y var3
respectivamente.
6.7.3 Opciones para read
Preguntar con -p
:
Puede mostrar un mensaje de aviso antes de capturar la entrada:
#!/bin/bash
read -p 'Enter your name: ' name
echo "Good morning, $name!"
Limitar la entrada con -n
:
Limitar el número de caracteres que el usuario puede introducir:
#!/bin/bash
read -p 'Enter your name (5 characters max): ' -n 5 name
echo -e "\nGood morning, $name!"
Tiempo de espera con -t
:
Establecer un límite de tiempo para la entrada:
#!/bin/bash
read -p 'Enter your name (within 5 seconds): ' -t 5 name
echo -e "\nGood morning, $name!"
Entrada silenciosa con -s
:
Para información sensible, como contraseñas, utilice -s
para ocultar la entrada:
#!/bin/bash
read -p 'Enter your password: ' -s pass
echo -e "\nThank you, your password has been recorded."
6.8 Realización de operaciones aritméticas
Bash soporta aritmética básica usando el comando `let:
#!/bin/bash
let "a = 5"
let "b = 7"
let "c = a + b"
echo $c
En este ejemplo, c
will output the sum of a
and b
, which is 12
.
6.8.1 Operadores aritméticos:
+
: Suma-
: Resta*
: Multiplicación/
: División**
: Exponenciación%
: Módulo
También puede utilizar la notación abreviada, donde let "a = a * 2"
is equivalent to let "a *= 2"
.
6.9 Acceso a los parámetros del script
Los scripts pueden aceptar parámetros, accesibles a través de variables especiales:
./yourscript.sh param1 param2 param3
$#
: Número de parámetros pasados al script$0
: The script’s name (./yourscript.sh
en este caso)$1
,$2
,$3
, etc.: El primer, segundo, tercer (y así sucesivamente) parámetro
6.10 Trabajo con matrices
Las matrices en Bash pueden utilizarse para almacenar y acceder a múltiples valores:
# Declarar un array
array=("value0" "value1" "value2")
# Acceder a un elemento
echo ${array[2]} # Salida `valor2'
# Modificar un elemento
array[2]="newValue"
# Imprimir todos los elementos
echo ${array[*]} # Salida de todos los elementos de la matriz
Las matrices ofrecen una forma flexible de trabajar con colecciones de datos en tus scripts.
6.11 Trabajar con condiciones
6.11.1 Sentencia if
básica
La sentencia if
comprueba una condición y ejecuta un bloque de código si la condición es verdadera:
name="Robert"
if [ "$name" == "Robert" ]; then
echo "Hi Robert"
fi
6.11.2 Sentencias if
anidadas
Puedes anidar sentencias if
unas dentro de otras o utilizar elif
para condiciones adicionales:
if [ condition1 ]; then
# Bloque de código para la condición1
elif [ condition2 ]; then
# Bloque de código para la condición2
else
# Bloque de código por defecto
if [ condition4 ]; then
# If anidado
fi
fi
6.11.3 Comparaciones de cadenas
Prueba | Descripción |
---|---|
$var1 == $var2 |
Comprueba si var1 es igual a var2 |
$var1 != $var2 |
Comprobar si var1 no es igual a var2 |
-z $var1 |
Comprobar si var1 está vacía |
-n $var1 |
Comprobar si var1 no está vacío |
6.11.4 Comparaciones numéricas
Prueba | Descripción |
---|---|
$num1 -eq $num2 |
num1 es igual a num2 |
$num1 -ne $num2 |
num1 no es igual a num2 |
$num1 -lt $num2 |
num1 es menor que num2 |
$num1 -gt $num2 |
num1 es mayor que num2 |
$num1 -le $num2 |
num1 es menor o igual que num2 |
$num1 -ge $num2 |
num1 es mayor o igual que num2 |
6.11.5 Pruebas de archivos
Prueba | Descripción |
---|---|
-e $file |
Comprobación de la existencia de un fichero |
-d $file |
Comprobar si el archivo es un directorio |
-f $file |
Comprobar si el archivo es un archivo normal |
-L $file |
Comprobar si el archivo es un enlace simbólico |
-r $file |
Comprobar si el archivo es legible |
-w $file |
Comprobar si se puede escribir en el archivo |
-x $file |
Comprobar si el archivo es ejecutable |
$file1 -nt $file2 |
Comprobar si file1 es más reciente que file2 |
$file1 -ot $file2 |
Comprueba si file1 es más antiguo que file2 |
6.11.6 Combinación de pruebas
- Utilice
&&
para AND lógico - Utilice
||
para OR lógico
6.11.7 Negación de una prueba
Utilice !
para negar una prueba:
if [ ! -e "$file" ]; then
echo "The file doesn't exist"
fi
6.11.8 Uso de case
para condiciones múltiples
La sentencia case
es útil para comparar una variable con varios patrones:
case $var in
"Bruno")
echo "Hello Bruno"
;;
"Michel")
echo "Hello Michel"
;;
"Jean")
echo "Hello Jean"
;;
*)
echo "I don't know you"
;;
esac
6.11.9 Bucles
Bucle While:
while [ condition ]; do
# Comandos
done
Bucle For:
Recorrer una lista de valores:
for variable in value1 value2 value3; do
echo "The variable is $variable"
done
Recorrer en bucle los archivos del directorio actual:
for file in $(ls); do
echo "File found: $file"
done
Bucle con una secuencia:
for i in $(seq 1 10); do
echo $i
done
6.12 Conclusión
Aprendiendo shell scripting, puedes automatizar tareas repetitivas, haciendo tu experiencia con Linux más productiva y agradable.