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.shPara tu script:
- Comience con
#!/bin/bashpara el intérprete. - Añadir
#para comentarios.
Ejemplo de script básico:
#!/bin/bash
# Listar archivos y directorios
lsPara 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.shEjecute el script:
./myscript.shDepurar el script:
bash -x myscript.sh6.4 Añadir scripts a $PATH
Para ejecutar el script desde cualquier lugar:
export PATH=$PATH:/path/to/scriptDespués de esto, puedes ejecutar tu script simplemente escribiendo su nombre:
myscript.sh6.5 Trabajar con variables
Para utilizar variables en el script:
#!/bin/bash
name="Alice"
echo $namePara textos multilínea:
To print multi-line texts, use echo -e and \n for new lines:
#!/bin/bash
greeting="Hello\neveryone"
echo -e $greeting6.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/userMarcas 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 nameEn 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 var3Este 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 $cEn 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.shen 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 matrizLas 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"
fi6.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
fi6.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
&¶ 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"
fi6.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"
;;
esac6.11.9 Bucles
Bucle While:
while [ condition ]; do
# Comandos
doneBucle For:
Recorrer una lista de valores:
for variable in value1 value2 value3; do
echo "The variable is $variable"
doneRecorrer en bucle los archivos del directorio actual:
for file in $(ls); do
echo "File found: $file"
doneBucle con una secuencia:
for i in $(seq 1 10); do
echo $i
done6.12 Conclusión
Aprendiendo shell scripting, puedes automatizar tareas repetitivas, haciendo tu experiencia con Linux más productiva y agradable.