Capitolo 5. Quoting

Sommario
5.1. Quoting di variabili
5.2. Escaping

Con il termine "quoting" si intende semplicemente l'inserimento di una stringa tra apici. Viene impiegato per proteggere i caratteri speciali contenuti nella stringa dalla reinterpretazione, o espansione, da parte della shell o di uno script. (Un carattere si definisce "speciale" se viene interpretato diversamente dal suo significato letterale, come il carattere jolly *.)

bash$ ls -l [Vv]*
 -rw-rw-r--    1 bozo  bozo       324 Apr  2 15:05 VIEWDATA.BAT
 -rw-rw-r--    1 bozo  bozo       507 May  4 14:25 vartrace.sh
 -rw-rw-r--    1 bozo  bozo       539 Apr 14 17:11 viewdata.sh

bash$ ls -l '[Vv]*'
ls: [Vv]*: No such file or directory

Tuttavia, alcuni programmi ed utility possono ancora reinterpretare o espandere i caratteri speciali contenuti in una stringa a cui è stato applicato il quoting. Un utilizzo importante del quoting è quello di proteggere un parametro passato da riga di comando dalla reinterpretazione da parte della shell, ma permettere ancora al programma chiamante di espanderlo.

bash$ grep '[Pp]rima' *.txt
file1.txt:Questa è la prima riga di file1.txt.
file2.txt:Questa è la prima riga di file2.txt.

È da notare che l'istruzione grep [Pp]rima *.txt, senza quoting, funziona con la shell Bash. [1]

Il quoting è anche in grado di eliminare la "fame" di a_capo tipica di echo.

bash$ echo $(ls -l)
total 8 -rw-rw-r-- 1 bozo bozo 130 Aug 21 12:57 t222.sh -rw-rw-r-- 1 bozo bozo 78 Aug 21 12:57 t71.sh


bash$ echo "$(ls -l)"
total 8
 -rw-rw-r--  1 bozo bozo 130 Aug 21 12:57 t222.sh
 -rw-rw-r--  1 bozo bozo  78 Aug 21 12:57 t71.sh

5.1. Quoting di variabili

Nella referenziazione di una variabile, è generalmente consigliabile racchiudere il nome della variabile tra apici doppi. Questo preserva dall'interpretazione tutti i caratteri speciali della stringa -- il nome della variabile [2] -- tranne $, ` (apice inverso) e \ (escape). [3] Mantenere il $ come carattere speciale consente la referenziazione di una variabile racchiusa tra doppi apici ("$variabile"), cioè, sostituire la variabile con il suo valore (vedi Esempio 4-1, precedente).

L'utilizzo degli apici doppi previene la suddivisione delle parole. [4] Un argomento tra apici doppi viene considerato come un'unica parola, anche se contiene degli spazi.

variabile1="una variabile contenente cinque parole"
COMANDO Questa è $variabile1    # Esegue COMANDO con 7 argomenti:
# "Questa" "è" "una" "variabile" "contenente" "cinque" "parole"

COMANDO "Questa è $variabile1"  # Esegue COMANDO con 1 argomento:
# "Questa è una variabile contenente cinque parole"


variabile2=""    # Vuota.

COMANDO $variabile2 $variabile2 $variabile2       
# Esegue COMANDO con nessun argomento.

COMANDO "$variabile2" "$variabile2" "$variabile2" 
# Esegue COMANDO con 3 argomenti vuoti.

COMANDO "$variabile2 $variabile2 $variabile2"      
# Esegue COMANDO con 1 argomento (2 spazi).

# Grazie, Stéphane Chazelas.

Suggerimento

È necessario porre gli argomenti tra doppi apici in un enunciato echo solo quando si ha come scopo la suddivisione delle parole o per preservare gli spazi.

Esempio 5-1. Visualizzare strane variabili

#!/bin/bash
# weirdvars.sh: Visualizzare strane variabili.

var="'(]\\{}\$\""
echo $var        # '(]\{}$"
echo "$var"      # '(]\{}$"     Nessuna differenza.

echo

IFS='\'
echo $var        # '(] {}$"     \ trasformata in spazio. Perché?
echo "$var"      # '(]\{}$"

# Esempi forniti da Stephane Chazelas.

exit 0

Gli apici singoli (' ') agiscono in modo simile a quelli doppi, ma non consentono la referenziazione alle variabili, perché non è più consentita la reinterpretazione di $. All'interno degli apici singoli, tutti i caratteri speciali, tranne ', vengono interpretati letteralmente. Gli apici singoli ("quoting pieno") rappresentano un metodo di quoting più restrittivo di quello con apici doppi ("quoting parziale").

Nota

Dal momento che anche il carattere di escape (\) viene interpretato letteralmente, effettuare il quoting di apici singoli mediante apici singoli non produce il risultato atteso.

echo "Why can't I write 's between single quotes" 
# Perché non riesco a scrivere 's tra apici singoli

echo

# Metodo indiretto.
echo 'Why can'\''t I write '"'"'s between single quotes'
#    |-------|  |----------|   |-----------------------|
#  Tre stringhe tra apici singoli a cui sono frapposti il carattere di 
#+ escape e l'apice singolo.

#  Esempio cortesemente fornito da Stéphane Chazelas.

Note

[1]

A meno che non ci sia, nella directory di lavoro corrente, un file con nome prima. Una ragione in più per usare il quoting. (Grazie a Harald Koenig per averlo sottolineato.

[2]

Si hanno effetti collaterali sul valore della variabile (vedi oltre)

[3]

Racchiudere il "!" tra doppi apici provoca un errore se usato da riga di comando. Viene interpretato come un comando di cronologia. In uno script, tuttavia, questo problema non si presenta, dal momento che la cronologia dei comandi di Bash è disabilitata.

Più interessante è il comportamento incoerente della "\" quando si trova tra i doppi apici.

bash$ echo ciao\!
ciao!


bash$ echo "ciao\!"
ciao\!




bash$ echo -e x\ty
xty


bash$ echo -e "x\ty"
x       y
           
(Grazie a Wayne Pollock per la precisazione.)

[4]

La "divisione delle parole", in questo contesto, significa suddividere una stringa di caratteri in un certo numero di argomenti separati e distinti.