Cómo gestionar la expansión de variables bash vacías o no

Cómo gestionar la expansión de variables bash vacías o no

Objetivo

El objetivo de este tutorial es aprender a modificar el comportamiento de Bash al expandir variables no establecidas o vacías usando sintaxis dedicada.

Requisitos

  • No se requieren privilegios de sistema especiales para seguir este tutorial

Introducción

La expansión de las variables es una de las características más comunes utilizadas en el shell: cuando existe una variable y es parte de un comando, se "expande", por lo que se sustituye por su valor. La expansión de las variables vacías es una de esas cosas, que si no está bien manejada, podría causar daños graves a un sistema: imagine un comando como este:

$ sudo rm -rf "/$ dir"

En un caso como este, si el $ dir La variable está vacía o no establecida, su expansión no produciría ningún valor, por lo tanto, el comando ejecutado real sería:

$ sudo rm -rf /

Nuestro sistema estaría condenado. Tratar, o prevenir mejor una situación como esa es de vital importancia. En este tutorial veremos cómo administrar la expansión de las variables vacías utilizando alguna sintaxis específica de Bash.



Use un valor predeterminado si una variable está vacía o no establecida

El primer caso que tenemos en cuenta es cuando se hace referencia a una variable unset o vacía en una expansión y queremos usar un valor de respuesta/predeterminado en su lugar. Supongamos que estamos haciendo referencia a los inexistentes $ Color variable como parte del siguiente comando:

$ Echo "El cielo es $ color"

El resultado de este comando sería:

el cielo es

Como se esperaba, dado que la variable no está establecida, nada resulta de su expansión, dejándonos con una oración inacabada (y un cielo sin color). No hay daño real en este caso, por supuesto, pero ¿cómo podríamos instruir al shell que use un valor predeterminado en un caso como este??

Hay una sintaxis diseñada específicamente para obtener este comportamiento, y es muy simple:

$ parámetro: -word

Así es como funciona:

$ echo "El cielo es $ color:-" azul "" El cielo es azul 

Cuando se usa esta sintaxis, si parámetro no existe o está vacío, la expansión dará como resultado el valor de palabra. En este caso, la variable $ Color no se estableció, por lo tanto, la carcasa usó "azul" como resultado de la expansión.

Vale la pena notar que incluso si la expansión dio como resultado el valor especificado como un "predeterminado", con esta sintaxis, después de que se realiza la expansión, el $ Color La variable seguirá sin ser:

$ echo "$ color" 

Use y también asigne un nuevo valor si una variable está vacía o no establecida

El comando anterior no devolvió la salida, ya que la variable, en ese punto, todavía no estaba configurada. ¿Qué pasa si queremos usar un valor especificado al expandir una variable no set o vacía, pero también asignar ese valor a la variable después de que se realiza la expansión?? Una sintaxis ligeramente diferente de lo que queremos:

$ parámetro: = word

Veamos un ejemplo en el que se usa esta sintaxis:

$ echo "El cielo es $ color: =" azul "" El cielo es azul 

Tal como pasó antes, palabra se ha utilizado en la expansión, desde parámetro (el $ Color variable) no se estableció. Además, palabra, ("Azul" en este caso), también se ha asignado como el valor para la variable previamente no establecida. Verificar que es muy fácil:

$ "El cielo es $ color" El cielo es azul 

Ver? La expansión del $ Color La variable ahora da como resultado "azul".



Use un valor alternativo si se establece una variable

Una sintaxis ligeramente diferente obtengamos un resultado incluso diferente, aquí está:

Parámetro:+Word

¿Cómo modifica el comportamiento del caparazón?? Cuando esta sintaxis se usa, si parámetro está vacío o no establecido, palabra voluntad no ser utilizado, por lo tanto, la expansión estará vacía. Si, en cambio, la variable tiene un valor, el resultado de la expansión será palabra, y el valor de parámetro no se cambiará. Aclaremos esto con algunos ejemplos:

Primer caso. La variable $ Color no está establecido, por lo tanto, el resultado de la expansión no será nada:

$ echo "El cielo es $ color:+" azul "" El cielo es 

Segundo caso. La variable $ Color tiene un valor: la expansión dará como resultado el valor especificado a la derecha de :+, Pero el valor del $ Color La variable no se cambiará:

# Asignar un valor a la variable "color" $ color = "rojo" # Dado que la variable está establecida, el resultado de la expansión será "azul" $ echo "El cielo es $ color:+" azul "" el Sky es azul # El valor de la variable "color" no se ha cambiado $ echo "$ color" rojo 
Copiar

Muestra un mensaje de error si una variable está vacía o no establecida

El último tipo de sintaxis que examinaremos aquí es:

$ parámetro:?palabra

Cuando se usa esta sintaxis, si parámetro no está configurado o vacío, el script saldrá con error. Además, palabra será enviado a stderr (Error estándar). En aras de este ejemplo, considere que la variable de "color" no es establecida como antes:

# El mensaje que especificamos se muestra al error estándar $ ECHO "El cielo es $ color:?"Color no establecido" "Bash: color: color no establecido 
Copiar

El comando salió con error y el color no establecido Se mostró el mensaje. En caso de que se establezca la variable, el resultado de la expansión sería su propio valor:

$ color = "azul" $ echo "El cielo es $ color:?"Color no establecido" "El cielo es azul 
Copiar

Tutoriales de Linux relacionados:

  • Sistema colgado de Linux? Cómo escapar a la línea de comando y ..
  • Variables de Bash especiales con ejemplos
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Archivos de configuración de Linux: los 30 principales más importantes
  • Scripting bash: verifique si existe el directorio
  • Cosas que hacer después de instalar Ubuntu 22.04 Jellyfish de Jammy ..
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Comandos de Linux: los 20 comandos más importantes que necesitas ..
  • Cómo gestionar la historia de Bash
  • Ubuntu 20.04 Guía