Guida avanzata di scripting Bash: Un'approfondita esplorazione dell'arte dello scripting di shell | ||
---|---|---|
Indietro | Avanti |
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 |
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. |
È 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").
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.
|
[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.
| |
[4] | La "divisione delle parole", in questo contesto, significa suddividere una stringa di caratteri in un certo numero di argomenti separati e distinti. |