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 Més preocupant pot resultar el comportament aparentment inconsistent de $ 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 |