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 $:

  1. quan és declada, assignada o desassignada (unset)
  2. quan s’exporta
  3. en expressions aritmètiques amb :doc:`doble parèntesis <dblparens>’
  4. en variables que representen senyals.

L’assignació pot realitzar-se:

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 espais

    A 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 que null 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.