Fundamentos de shell scripting

Fundamentos de shell scripting

Bash | Variables | Argumentos de línea de comandos | Lectura de variables | Operaciones aritméticas

English version: Shell scripting fundamentals


Los scripts de shell son programas diseñados para ejecutarse por la shell de Unix y generalmente son usados para automatizar tareas repetitivas o ejecutar un conjunto de tareas complejas a través de comandos de shell.

El siguiente es un ejemplo de un script en shell:

#!/bin/bash

# Script example
echo "Hello World!"
  • #!: La línea "shebang" indica el intérprete a usar, en este caso bash.

  • Todos los comentarios inician con "#".

  • Una vez que se ejecute el programa imprimirá "Hello World!" en la pantalla.

La manera de ejecutar el programa será la siguiente:

./hello_world.sh

Es importante asignar los permisos de ejecución al archivo por medio del comando chmod +x hello_world.sh

Variables

El nombrado de las variables en shell se rigen a las siguientes normas:

  • Deben empezar con una letra o un guión bajo.

  • Los números son permitidos en cualquier otra posición.

  • No pueden llevar caracteres especiales como @, #, %, $.

  • Se distiguen entre mayúsculas y minúsculas ( var != VAR ).

  • Variables permitidas: VARIABLE, VAR123, var_name, _var

  • Variables no permitidas: 1var, %var, var-name

Para hacer referencia a una variable, se debe anteponer el signo $ al nombre de la variable ( $PATH, $my_var ).

Buena práctica

Los nombres de las variables locales deben escribirse en minúscula y se deben separar las palabras con guiones bajos ( my_var ).

Existen 2 tipos de variables

  • Globales (ambiente/entorno):

    • Proveen una forma simple de compartir configuraciones entre múltiples programas.

    • Usan solo letras en mayúscula por convención ( PATH, PWD ).

    • Pueden listarse ejecutando el comando printenv o env.

    • Se heredan en las subshells.

    • Para declararlas se debe anteponer la palabra export ( export name=value ).

  • Locales:

    • Están disponibles solo en la shell donde fueron creadas.

    • No se heredan en las subshells.

Una subshell es un proceso hijo iniciado por una shell o un script de shell.

  • Ejecutar un script de shell siempre inicia una nueva subshell y se ejecuta en esta.

  • Se puede iniciar una subshell ejecutando el comando bash desde una shell interactiva.

Herencia de variables

Una variable global declarada en la shell podrá ser accesible en una subshell iniciada desde la shell inicial, mientras que una variable global declarada en una subshell no será accesible desde la shell inicial.

> export VAR1=value
> bash
> echo $VAR1
value
> var1=value
> bash
> echo $var1
-- no existe el valor en la subshell --
> bash
> export VAR1=value
> echo $VAR1
value
> exit
> echo $VAR1
-- no existe el valor en la shell --

Argumentos de línea de comandos

Es posible pasar valores a los scripts el momento que van a ser ejecutados a través de la línea de comandos como se ve en el siguiente ejemplo:

#!/bin/bash

text_to_print=$1
echo $text_to_print
> ./hello_world.sh 'Hello World!'
Hello World!

Al ejecutar un script, el comando ingresado se divide en múltiples partes y cada parte es almacenada en variables integradas empezando con el número 0, el comando en sí estará disponible en la variable llamada $0 y la segunda parte del comando (el valor que queremos pasar al script) se almacena en la variable $1, en caso de tener más partes en el comando, estas se almacenarán en $2, $3, $4, etc.

Buena práctica

Pasar argumentos para establecer los valores necesarios de las variables definidas en el script ayudan a que estos puedan ser reutilizados y no sea necesaria su edición cada vez antes de ejecutarlos.

Lectura de variables

Otra manera de pasar variables a un script es solicitarla al usuario una vez que este se ejecuta, en lugar de pasarla a través de la línea de comandos como se en el siguiente ejemplo:

#!/bin/bash

read -p "Enter the text to print: " text_to_print
echo $text_to_print
> ./hello_world.sh
Enter the text to print: Hello World!
Hello World!

Al usar el comando read seguido del nombre de la variable, cuando el script se ejecuta y llega a esa instrucción, esperará a que el usuario ingrese un valor, una vez que esto suceda se almacenará ese valor en la variable indicada.

El comando read puede estar acompañado de la opción -p antes de la especificación del nombre de la variable para añadir un mensaje descriptivo a la solicitud de ingreso del valor.

Argumentos de línea de comandos vs Lectura de variables

Ambos tipos de asignación de variables permiten que el script pueda ser reutilizado sin la necesidad de modificarlo antes de usarlo, pero cada una de estas opciones se deben usar en diferentes situaciones.

  • Argumentos de línea de comandos

    • Scripts que son llamados por otros scripts.

    • Scripts que no requieran una intervención manual.

  • Lectura de variables

    • Scripts sencillos y que se usen de manera independiente.

    • Scripts que requieran una confirmación (antes de eliminar un archivo, hacer cambios importantes en el sistema, etc).

Se puede usar ambas opciones en un mismo script, pero siempre que exista una lectura de variables, se requerirá una intervención manual para continuar la ejecución.

Operaciones aritméticas

Existen diferentes maneras de realizar operaciones aritméticas en la shell, una de estas es usando el comando expr como se ve en el siguiente ejemplo:

> expr 2 + 3
5

Al ingresar una expresión aritmética como entrada para el comando expr se obtendrá el resultado como salida.

Es importante que el operador ( +, -, *, /, **, % ) esté separado de los valores por un espacio.

En el caso de la multiplicación, el operador debe llevar el símbolo de escape \* (debido a que el símbolo de asterísco es un caracter de rechazo reservado en shell).

También se pueden realizar operaciones aritméticas con variables como se ve en el siguiente ejemplo:

> A=2
> B=3
> expr $A + $B
5

Otra manera de realizar operaciones aritméticas en bash es usar paréntesis dobles, esta forma se asemeja más a como se realizaría en otro lenguaje de programación, de esta manera se encapsula la expresión dentro de paréntesis dobles con el símbolo $ como prefijo como se ve en el siguiente ejemplo:

> echo $((2 + 3))
5
> A=2
> B=3
> echo $((A*B))
6

Al usar paréntesis dobles se deben tener en cuenta las siguientes consideraciones:

  • No es necesario mantener el espacio entre el operador y los valores/variables.

  • No es necesario usar el símbolo de escape \ con el operador *.

  • No es necesario colocar el símbolo $ como prefijo de cada variable, es suficiente con uno antes de los paréntesis.

Tanto expr como paréntesis dobles únicamente retornan un número entero como salida en una división cuando la entrada son números enteros, pero para esto se puede emplear la utilidad llamada bc (esta funciona como una calculadora básica en Linux) con la opción -l para generar resultados con decimales como se puede ver en el siguiente ejemplo:

> echo $((10 / 3))
3
> echo 10 / 3 | bc -l
3.33

bc funciona en modo interactivo por defecto, donde solo se ingresa la expresión y esta genera el resultado, pero es posible usarlo junto con el comando echo y el caracter pipe | para no ingresar al modo interactivo y así obtener el resultado directamente.


Si te resultó útil, dale me gusta/comparte a este artículo para que llegue a otros y si eres nuevo en el blog, ¡te agradecería que me sigas! Trato de escribir artículos para mantener un registro de todo lo que he aprendido o que personalmente quiero leer y me encanta saber cómo lo hice u obtener ideas de los lectores.

¡Hasta la próxima!