5.1. Variables entre cometes

En referenciar una variable, en general es recomanable posar-la entre cometes dobles per evitar que es reinterpretin tots els caràcters especials que hi pugui contenir (a excepció de $, la cometa invertida ` i la contrabarra \[1].

El caràcter $ es manté amb el seu significat especial per permetre referenciar el contingut de les variables. Mira 4.1. Substitució de variables per més detall.

Farem servir les cometes dobles per evitar que es separin les paraules que apareixen en el text separades per blancs. Un valor entre cometes dobles es presenta com una única paraula, fins i tot si conté espais en blanc.

Posarem els arguments d’una crida a echo entre cometes dobles només quan ens sigui important separar per paraules o preservar els espais.

Exemple 1. Preservació d’espais en blanc

# Demostració de l'ús de les cometes dobles per preservar espais en blanc
Llista="un dos tres"

for a in $Llista     # Cada paraula separada per espais en blanc.
do
    echo "$a"
done
# Sortida:
#   un
#   dos
#   tres

echo "---"

for a in "$Llista"   # Considera els espais en blanc com part de la paraula.
do #     ^     ^
    echo "$a"
done
# Sortida: un dos tres

Exemple 2. Espais en blanc i variables buides

# Demostració de l'ús de les cometes dobles per preservar espais en blanc

# funció que mostra quantes paraules rep
function compta_arguments () { echo "Paraules rebudes: $# "; }

frase1="una variable amb cinc paraules"
frase2=""    # Buida

compta_arguments Això és $frase1               # Sortida: Paraules rebudes: 7

compta_arguments "Això és $frase1"             # Sortida: Paraules rebudes: 1

compta_arguments $frase2 $frase2 $frase2       # Sortida: Paraules rebudes: 0

compta_arguments "$frase2" "$frase2" "$frase2" # Sortida: Paraules rebudes: 3

compta_arguments "$frase2 $frase2 $frase2"     # Sortida: Paraules rebudes: 1

Nota

Aquest exemple mostra la definició d’una funció. Pots trobar més detalls sobre funcions a XXX Chapter 24. Functions.

Exemple 3. Com mostrar variables rares

#!/bin/bash
# Demostració de com mostrar variables "rares"

echo

var="'(]\\{}\$\""           # Inclou cometes dins de cometes!
echo $var        # '(]\{}$"
echo "$var"      # '(]\{}$"     No fa cap diferencia

echo

IFS='\'
echo $var        # '(] {}$"     \ es converteix en un espai. Perquè?
echo "$var"      # '(]\{}$"

echo

var2="\\\\\""
echo $var2       #   "
echo "$var2"     # \\"
echo
# Però en canvi... var2="\\\\"" no és legal. Perquè?

var3='\\\\'
echo "$var3"     # \\\\
# En canvi, si fem cometes fortes sí que funciona.

# El primer exemple demostra que està permés posar cometes dins de cometes.
echo "$(echo '"')"           # "
#    ^           ^

# De vegades pot ser útil
var1="Dues paraules"
echo "\$var1 = "$var1""      # $var1 = Dues paraules
#    ^                ^

Les cometes simples funcionen de manera semblant a les dobles. Entre d’altres coses, però, no permeten referenciar variables donat que el significat especial de $ es perd. Dins de cometes simples, cada caràcter especial és interpretat literalment. Les cometes simples es consideren com a completes o fortes, mentre que les dobles es consideren com parcials o febles.

Com que fins i tot el \ és interpretat literalment dins de cometes simples, ens trobarem que intentar posar cometes simples dins de cometes simples no ens donarà el resultat esperat.

# Demostració de cometes simples dins de cometes simples
echo "Com m'has afegit una cometa simple com aquesta ' entre cometes simples?"

echo 'Com m'\''has afegit una cometa simple com aquesta '"'"' entre cometes simples?'
#    |-----|  |-----------------------------------------|   |-----------------------|
# Són tres cadenes entre cometes simples amb una cometa simple escapada i una
# altra entre cometes dobles.

Anotacions

[1]

Posar entre cometes ! en la línia de comandes, ens generarà un error donat que arrenca el mecanisme d’històric. Això no passa dins d’un guió on l’històric queda deshabilitat.

Més preocupant pot resultar el comportament aparentment inconsistent de \ entre cometes dobles, especialment seguint echo -e.

$ echo hola\!
hola!
$ echo "hola\!"
hola\!


$ echo \
>
# surt amb control-c
$ echo "\"
>
# surt amb control-c
$ echo \a
a
$ echo "\a"
\a


$ echo x\ty
xty
$ echo "x\ty"
x\ty

$ echo -e x\ty
xty
$ echo -e "x\ty"
x       y

Les cometes dobles a continuació de echo de vegades escapen \. És més, l’opció -e fa que \t sigui interpretat com un tabulador.