4.1. Substitució de variables¶
El nom d’una variable és un marcador o referència al seu valor. El valor de la variable és la dada que conté la posició de memòria a què fa referència. En diem substitució de variable a l’obtenció del valor associat a la variable.
Comencem diferenciant cuidadosament entre el nom d’una variable i el seu valor.
Si variable1
és el nom d’una variable, llavors $variable1
fa referència al seu valor, és a
dir, la dada guardada en la posició de memòria a la que fa referència variable1
[1].
Per exemple, considera el següent codi:
$ variable1=23
$ echo variable1
variable1
$ echo $variable1
23
Trobarem el nom de les variables sense $
:
- quan és declada, assignada o desassignada (unset)
- quan s’exporta
- en expressions aritmètiques amb :doc:`doble parèntesis <dblparens>’
- en variables que representen senyals.
L’assignació pot realitzar-se:
amb
=
com envar1=27
amb una instrucció de lectura
read
com a Exemple 3. Variable assignment, using read.a la capçalera d’un bucle:
for var in 1 2 3; do echo $var; done
Encara que tanquem un valor entre cometes dobles, no s’evita la substitució. Per això se li diu
cometes parcials o també cometes febles. Amb les cometes simples, en canvi, sí s’anul·la la
substitució i el nom de la variable (juntament amb $
) s’interpreten literalment. És el que es
coneix com a cometes completes o cometes fortes. Mira Chapter 5. Cometes per una discussió completa
d’aquest tema.
Cal tenir present què $variable
és, en realitat, una forma simplificada de l’expressió
${variable}
.
En alguns contexts en que la forma simplificada $variable
pot donar problemes, la forma completa
${variable}
podria funcionar. Mira XXX 10.2. Substitució de paràmetres per més detalls.
Veiem un exemple:
#!/bin/bash
# Exemple d'inicialització i substitució de variable
a=375
variable=$a
# ^ ^ sense espais
echo variable # Sortida: variable
# No es una referència a variable, simplemente és el String "variable"
echo $variable # Sortida: 375
# ^ Ara sí que és una referència a variable.
echo ${variable} # Sortida: 375
# La versió ampliada de la referència.
# Amb cometes febles, en aquest cas el resultat no canvia
echo "$variable" # Sortida: 375
echo "${variable}" # Sortida: 375
# XXX TODO: vas per aquí. Estàs passant les explicacions "gruixudes" al text que la descriu.
echo
# Provem amb Strings
variable="A B C D"
# ^ ^^ ^^^ diferents espais
echo $variable # Sortida: A B C D
echo "$variable" # Sortida: A B C D
# Fixa't que echo $variable i echo "$variable" donen resultats diferents.
echo
echo '$variable' # Sortida: $variable
# ^ ^
# Amb cometes simples, no es fa la substitució donat que $ s'interpreta literalment
# Comprovem els efectes de les diferents cometes
variable= # assignem el valor null
echo "\$variable (valor null) = $variable" # Sortida: $variable (valor null) =
# Assignar-li el valor null equivaldria a desassignar la variable.
# Assignació múltiple en una mateixa línia
var1=21 var2=22 var3=$V3
echo
echo "var1=$var1 var2=$var2 var3=$var3"
echo; echo
nombres="un dos tres"
# ^ ^
altres_nombres="1 2 3"
# ^ ^
# Quan el valor d'una variable conté espais, és obligatori posar-lo entre cometes.
# altres_nombres=1 2 3 # Generaria un missatge d'error.
echo "nombres = $nombres"
echo "altres_nombres = $altres_nombres" # Sortida: altres_nombres = 1 2 3
# També funciona si escapem els espais
una_cosa=1\ ---\ cosa
# ^ ^ un espai després de l'escape (\).
echo "$una_cosa" # 1 --- cosa
echo; echo
echo "variable_no_inicialitzada = $variable_no_inicialitzada"
# Una variable sense inicialitzar no té cap valor.
variable_no_inicialitzada= # Així la declarem però no la inicialitzem, el que
#+ equival a assignar-li el valor null, com abans.
echo "variable_no_inicialitzada = $variable_no_inicialitzada"
# Encara amb valor null.
variable_no_inicialitzada=23 # Ara queda inicialitzada.
unset variable_no_inicialitzada # Ara la desassignem.
echo "variable_no_inicialitzada = $variable_no_inicialitzada"
# Sortida: variable_no_inicialitzada =
# Continua mostrant un valor null
echo
exit 0
A tenir present:
En assignacions,
=
sense espaisA l’hora d’assignar un valor a una variable no es pot posar espais en blanc ni abans ni després del
=
.Si el posem abans, s’intentaria executar la variable com si fos una comanda amb un argument:
variable =42 # ^
En el cas que l’espai estigui després, s’intentarà executar el valor com una comanda amb la variable assignada a “” com a variable d’entorn.
variable= 42 # ^
Les cometes febles conserven blancs
Quan posem una variable entre cometes, es preserven els espais en blanc del seu valor
variable="A B C D" # ^ ^^ ^^^ diferents espais echo $variable # Sortida: A B C D echo "$variable" # Sortida: A B C D
Més d’una assignació per línia
És possible assignar més d’una variable en una mateixa línia si les separem amb espais blancs.
var1=21 var2=22 var3=$V3
Compte
Aquesta pràctica pot fer més difícil de llegir el nostre codi i podria no ser portable. Podria donar problemes amb versions antigues de
sh
.Les variables sense inicialitzar tenen valor
null
Una variable sense inicialitzar té el valor
null
que indica que no té cap valor assignat. Compte quenull
no és zero.if [ -z "$variable_no_inicialitzada" ] then echo "\$variable_no_inicialitzada val null." fi # Sortida: $variable_no_inicialitzada val null.
Pot provocar problemes l’ús d’una variable abans de ser inicialitzada. Amb tot, és possible realitzar operacions aritmètiques amb variables no inicialitzades.
echo "$variable_no_inicialitzada" # (una línia en blanc) let "variable_no_inicialitzada += 5" # Suma 5 al seu valor echo "$variable_no_inicialitzada" # Sortida: 5
Això implica que, malgrat una variable no inicialitzada val null, en cas de realitzar una operació aritmètica amb ella, es considera que té com a valor el 0.
Considera també Exemple 20. Un guió (inutil) que s’autocarrega.
Anotacions
[1] | Tècnicament, el nom d’una variable es coneix com a lvalue o valor esquerre,
perquè apareix a la part esquerra d’una assignació. En canvi, el valor d’una variable és coneix
com a rvalue doncs sol apareixer a la part dreta de l’assignació: variable2=$variable1 . |