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