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.
Contenido
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!