Bash - Uso de variables¶
En este capítulo aprenderá a usar variables en tus scripts bash.
Objetivos: En este capítulo aprenderá como:
Almacenar información para su posterior uso;
Eliminar y bloquear variables;
Utilizar variables de entorno;
Comandos de sustitución;
linux, script, bash, variable
Conocimiento:
Complejidad:
Tiempo de lectura: 10 minutos
Almacenar información para su posterior uso¶
Como en cualquier lenguaje de programación, los scripts de shell utilizan variables. Se utilizan para almacenar información en memoria para ser reutilizada según sea necesario durante el script.
Una variable se crea cuando recibe su contenido. Y sigue siendo válida hasta el final de la ejecución del script o a petición explícita del autor del script. Dado que el script se ejecuta secuencialmente de principio a fin, es imposible llamar a una variable antes de que se cree.
Se puede cambiar el contenido de una variable durante el script, ya que la variable continúa existiendo hasta que el script termina. Si su contenido se elimina, la variable permanece activa pero no contiene nada.
La noción de un tipo de variable en un script de shell es posible, pero es muy raramente usada. El contenido de una variable es siempre un carácter o una cadena.
#!/usr/bin/env bash
#
# Author : Rocky Documentation Team
# Date: March 2022
# Version 1.0.0: Save in /root the files passwd, shadow, group, and gshadow
#
# Global variables
FILE1=/etc/passwd
FILE2=/etc/shadow
FILE3=/etc/group
FILE4=/etc/gshadow
# Destination folder
DESTINATION=/root
# Clear the screen
clear
# Launch the backup
echo "Starting the backup of $FILE1, $FILE2, $FILE3, $FILE4 to $DESTINATION:"
cp $FILE1 $FILE2 $FILE3 $FILE4 $DESTINATION
echo "Backup ended!"
Este script hace uso de variables. El nombre de una variable debe comenzar con una letra, pudiendo contener cualquier secuencia de letras o números. Excepto para el guión bajo "_", los caracteres especiales no se pueden utilizar.
Por convención, las variables creadas por un usuario tienen el nombre en minúsculas. Este nombre debe elegirse con cuidado para no ser demasiado evasivo o demasiado complicado. Sin embargo, una variable puede ser nombrada con letras mayúsculas, como en este caso, si es una variable global que no debe ser modificada por el programa.
El carácter =
asigna contenido a una variable:
variable=value
rep_name="/home"
No hay espacio antes o después del signo =
.
Una vez creada la variable, puede utilizarse anteponiéndole un dólar $.
file=file_name
touch $file
Se recomienda encarecidamente proteger las variables con comillas, como en el siguiente ejemplo:
file=file name
touch $file
touch "$file"
Como el contenido de la variable contiene un espacio, el primer touch
creará 2 archivos mientras que el segundo touch
creará un archivo cuyo nombre contendrá un espacio.
Para aislar el nombre de la variable del resto del texto, debe utilizar comillas o llaves:
file=file_name
touch "$file"1
touch ${file}1
Se recomienda el uso sistemático de llaves.
El uso de apóstrofes inhibe la interpretación de caracteres especiales.
message="Hello"
echo "This is the content of the variable message: $message"
Here is the content of the variable message: Hello
echo 'Here is the content of the variable message: $message'
Here is the content of the variable message: $message
Eliminar y bloquear variables¶
El comando unset
permite eliminar una variable.
Ejemplo:
name="NAME"
firstname="Firstname"
echo "$name $firstname"
NAME Firstname
unset firstname
echo "$name $firstname"
NAME
El comando readonly
o typeset -r
bloquea una variable.
Ejemplo:
name="NAME"
readonly name
name="OTHER NAME"
bash: name: read-only variable
unset name
bash: name: read-only variable
Note
La instrucción set -u
al principio del script detendrá la ejecución del script si se utilizan variables no declaradas.
Utilizar variables de entorno¶
Las variables de entorno y las variables del sistema son variables utilizadas por el sistema para su operación. Por convención se nombran con letras mayúsculas.
Como todas las variables, se pueden mostrar cuando se ejecuta un script. Aunque se desaconseja encarecidamente, también pueden modificarse.
El comando env
muestra todas las variables de entorno utilizadas.
El comando set
muestra todas las variables del sistema utilizadas.
Entre las docenas de variables de entorno, varias son de interés para ser utilizadas en un script de shell:
Variables | Descripción |
---|---|
HOSTNAME |
El nombre de la máquina. |
USER , USERNAME y LOGNAME |
El nombre del usuario conectado a la sesión. |
PATH |
La ruta para encontrar los comandos. |
PWD |
El directorio actual, actualizado cada vez que se ejecuta el comando cd. |
HOME |
El directorio de inicio. |
$$ |
El id de proceso de ejecución del script. |
$? |
Código de salida del último comando ejecutado. |
El comando export
le permite exportar una variable.
Una variable sólo es válida en el entorno del proceso del script de shell. Para que un hijo del script conozca las variables y su contenido, estas deben ser exportadas.
La modificación de una variable exportada en un proceso hijo no se puede trazar hasta el proceso padre.
Note
Sin ninguna opción, el comando export
muestra el nombre y los valores de las variables exportadas en el entorno.
Comandos de sustitución¶
Es posible almacenar el resultado de un comando en una variable.
Note
Esta operación sólo es válida para comandos que devuelven un mensaje al final de su ejecución.
La sintaxis para subejecutar un comando es la siguiente:
variable=`command`
variable=$(command) # Preferred syntax
Ejemplo:
$ day=`date +%d`
$ homedir=$(pwd)
Con todo lo que acabamos de ver, nuestro script de copia de seguridad podría verse así:
#!/usr/bin/env bash
#
# Author : Rocky Documentation Team
# Date: March 2022
# Version 1.0.0: Save in /root the files passwd, shadow, group, and gshadow
# Version 1.0.1: Adding what we learned about variables
#
# Global variables
FILE1=/etc/passwd
FILE2=/etc/shadow
FILE3=/etc/group
FILE4=/etc/gshadow
# Destination folder
DESTINATION=/root
## Readonly variables
readonly FILE1 FILE2 FILE3 FILE4 DESTINATION
# A folder name with the day's number
dir="backup-$(date +%j)"
# Clear the screen
clear
# Launch the backup
echo "****************************************************************"
echo " Backup Script - Backup on ${HOSTNAME} "
echo "****************************************************************"
echo "The backup will be made in the folder ${dir}."
echo "Creating the directory..."
mkdir -p ${DESTINATION}/${dir}
echo "Starting the backup of ${FILE1}, ${FILE2}, ${FILE3}, ${FILE4} to ${DESTINATION}/${dir}:"
cp ${FILE1} ${FILE2} ${FILE3} ${FILE4} ${DESTINATION}/${dir}
echo "Backup ended!"
# The backup is noted in the system event log:
logger "Backup of system files by ${USER} on ${HOSTNAME} in the folder ${DESTINATION}/${dir}."
Al ejecutar nuestro script de copia de seguridad:
$ sudo ./backup.sh
obtendremos:
****************************************************************
Backup Script - Backup on desktop
****************************************************************
The backup will be made in the folder backup-088.
Creating the directory...
Starting the backup of /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow to /root/backup-088:
Backup ended!
Author: Antoine Le Morvan
Contributors: Steven Spencer, Pedro garcia