Variables avanzadas en Bash

variables avanzadas en bash

En el post anterior vimos la primera parte de las variables en Bash, donde hablamos de la declaración y la sintaxis y algunos conceptos básicos sobre arrays. En este post trataremos el uso de variables avanzadas en Bash y cómo podemos usarlas.

Variables predefinidas en Bash

Bash también cuenta con una serie de variables predefinidas que te proporcionan información útil sobre el entorno de ejecución del script, sus argumentos o procesos. Recordemos que estas variables se pueden leer directamente en la consola, sin tener que crear scripts (a excepción de algunas que ya veremos):

  • $0: contiene el nombre del script que se está ejecutando, básicamente el nombre del archivo.
  • $USER: El nombre del usuario que está ejecutando el script.
  • $HOME: El directorio home del usuario.
  • $PWD: El directorio actual de trabajo.
  • $PATH: Es la lista de directorios en los que Bash busca comandos o scripts
  • $@: Todos los argumentos pasados al script.

$#
La cantidad de argumentos que se pasaron al script. Por ejemplo si hacemos algo como:

./script.sh prod env

Nos devolvería 2 ya que prod y env son valores enviados al archivo para que se procesen.

$1, $2, $3

Representan los valores de acuerdo a la posición en que se enviaron:

echo "El primer argumento es: $1"
echo "El segundo argumento es: $2"

Hay más, pero las más comunes son estas y podemos utilizarlas en los escenarios normales de nuestro trabajo.

Variables de Entorno vs. Variables Locales

En Bash, hay dos tipos principales de variables:

  • Variables locales: son las que declaras dentro de un script o en la terminal, y su valor solo está disponible en el archivo o script actual, o sea el que se está ejecutando.
  • Variables de entorno: son accesibles globalmente por todos los programas y procesos que se ejecutan con ese script. Se inicializan usando la palabra export.

Con las variables locales no creo que tengamos problemas. Es una variable que solo tiene efecto en el script que estamos ejecutando, como cualquier otra:

telefono="123 445 5667"
edad=23

Listo, con esto ya podemos usar esas variables en nuestro archivo.

Ahora, con las variables de entorno en Bash es un diferente, aunque en realidad es fácil de entender. Estas variables funcionan fuera del archivo, es decir, podemos usar las variables declaradas en este archivo en otros archivos, conservando el valor. Vamos a un ejemplo.

Imaginemos que tener nuestro primer archivo que se llama main.sh que debe verificar un servicio para obtener el puerto en el que está corriendo. El valor de este puerto será usado por otros archivos para no tener que repetir la misma verificación en cada script.

Archivo main.sh:

#!/bin/bash

# lógica para obtener el puerto

export PUERTO_SERVICIO="3033"

./script_externo_1.sh
./script_externo_2.sh
./script_externo_3.sh

Como vemos, lo que diferencia a una variable local de una de entorno es el uso de export. Con esta palabra le decimos que será usada en la sesión de ejecución y puede ser usada por otros archivos.

Archivo script_externo_X.sh (ya saben, a darle permisos de ejecución a los archivos externos y al main):

#!/bin/bash

echo "Puerto que se usará: $PUERTO_SERVICIO"

Con esto ya podremos usar $PUERTO_SERVICIO en nuestro script externo.

Podemos sobreescribir el valor, ya que nada nos impide declarar una variable con el mismo valor:

#!/bin/bash

echo "Puerto que se usará: $PUERTO_SERVICIO"

PUERTO_SERVICIO=10000

echo "Puerto que se usará: $PUERTO_SERVICIO"

Su salida sería:

# Haciendo referencia al valor del archivo main.sh
Puerto que se usará: 3033

# Mostrando el nuevo valor
Puerto que se usará: 10000

read en Bash para leer valores

El comando read en Bash se utiliza para leer datos del usuario o de un archivo y asignarlas a una o más variables. Es una herramienta que permite interactuar con el usuario dentro de scripts y recibir datos directamente desde la terminal o archivos.

La sintaxis es la siguiente y es el ejemplo más básico.

echo "Introduce tu nombre:"
read nombre
echo "Hola, $nombre"

Con esto capturamos un valor y la acción de captura finaliza cuando damos enter.

Capturar múltiples valores en Bash

Podemos leer varios valores de una misma vez:

echo "Captura tu usuario y contraseña: "
read usuario password

echo "Nombre: $usuario"
echo "Contraseña: $password"

Debemos separar los valores por un espacio y luega damos enter.

Proporcionar un valor por defecto

Algunas veces necesitamos un valor por defecto, es decir, que en caso de que el usuario no requiera capturar un valor, ya que el predeterminado le funciona, podemos usarlo. Por ejemplo, cuando queremos conectarnos a una base de datos, podemos usar localhost como host.

#!/bin/bash

read -p "Captura el host(por defecto: localhost): " host
host=${host:-localhost}

echo "Conectando a $host"

Vemos que en la línea host=${host:-localhost} es algo como un operador ternario. Donde usamos -localhost (la instrucción ignora el “guion”, pero tú no deberías porque no funcionaría) para darle el valor por default en caso de que host esté en blanco.

Igual podemos usar una variable que actúe como el valor por default:

#!/bin/bash

default=localhost

read -p "Captura el host(por defecto: localhost): " host
host=${host:-$default}

echo "Conectando a $host"

Leer entrada sin mostrar lo que se escribe

Algunas otras veces, será necesario que no se muestre lo que el usuario está capturando, por ejemplo las contraseñas. Para lograr esto usamos el switch -s.

#!/bin/bash

read -sp "Captura la contraseña: " password

echo
echo "Contraseña recibida."

Sabemos que -s es para que no se muestre ¿pero la p? Bueno, es solo para que nos muestre un mensaje, en este caso “Captura la contraseña: “, y se detenga, de lo contrario, si usamos solo la -s nos tirará un error.

Leer un archivo línea por línea en Bash

Uno de los usos más comunes es trabajar con archivos y sus valores. En Bash podemos enviarle a un ciclo (bucle) un archivo para que lo lea y vaya haciendo operaciones línea a línea:

#!/bin/bash

while read linea; do
    echo "Valor $linea"
    echo " >> valor*2:" $(( linea * 2 ))
done < datos.txt

La salida sería:

Valor 21
  >> *2: 42
Valor 13
  >> *2: 26
Valor 56
  >> *2: 112
Valor 84
  >> *2: 168
Valor 11
  >> *2: 22
...

Recordemos que esto es con fines educativos, podemos usar csvkit o algo así para tratar de otra manera los archivos. Hay que usar lo que nos facilite la vida, chicos!

Hasta aquí hemos cubierto el tema de variables avanzadas en Bash y la mayoría de los usos más comunes.

¡Gracias por leer!


Posted

in

, ,

by