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.