Guida avanzata di scripting Bash: Un'approfondita esplorazione dell'arte dello scripting di shell | ||
---|---|---|
Indietro | Avanti |
La sostituzione di comando riassegna il risultato di un comando [1], o anche di più comandi. Letteralmente: connette l'output di un comando ad un altro contesto. [2]
La forma classica di sostituzione di comando utilizza gli apici singoli inversi (`...`). I comandi all'interno degli apici inversi (apostrofi inversi) generano una riga di testo formata dai risultati dei comandi.
nome_script=`basename $0` echo "Il nome di questo script è $nome_script." |
I risultati dei comandi possono essere usati come argomenti per un altro comando, per impostare una variabile e anche per generare la lista degli argomenti in un ciclo for.
rm `cat nomefile` # "nomefile" contiene l'elenco dei file da cancellare. # # S. C. fa notare che potrebbe ritornare l'errore "arg list too long". # Meglio xargs rm -- < nomefile # ( -- serve nei casi in cui "nomefile" inizia con un "-" ) elenco_filetesto=`ls *.txt` # La variabile contiene i nomi di tutti i file *.txt della directory #+ di lavoro corrente. echo $elenco_filetesto elenco_filetesto2=$(ls *.txt) # Forma alternativa di sostituzione di comando. echo $elenco_filetesto2 # Stesso risultato. # Un problema possibile, nell'inserire un elenco di file in un'unica stringa, # è che si potrebbe insinuare un ritorno a capo. # # Un modo più sicuro per assegnare un elenco di file ad un parametro #+ è usare un array. # shopt -s nullglob # Se non viene trovato niente, il nome del file #+ non viene espanso. # elenco_filetesto=( *.txt ) # # Grazie, S.C. |
La sostituzione di comando invoca una subshell. |
La sostituzione di comando può dar luogo alla suddivisione delle parole.
Anche quando la suddivisione delle parole non si verifica, la sostituzione di comando rimuove i ritorni a capo finali.
|
L'uso di echo per visualizzare una variabile senza quoting, e che è stata impostata con la sostituzione di comando, cancella i caratteri di ritorno a capo dall'output del/dei comando/i riassegnati. Questo può provocare spiacevoli sorprese.
|
La sostituzione di comando consente anche di impostare una variabile al contenuto di un file, sia usando la redirezione che con il comando cat.
variabile1=`<file1` # Imposta "variabile1" al contenuto di "file1". variabile2=`cat file2` # Imposta "variabile2" al contenuto di "file2". # Questo, tuttavia, genera un nuovo processo, quindi #+ questa riga di codice viene eseguita più #+ lentamente della precedente. # Nota: # Le variabili potrebbero contenere degli spazi, #+ o addirittura (orrore) caratteri di controllo. |
# Frammenti scelti dal file di sistema /etc/rc.d/rc.sysinit #+ (su un'installazione Red Hat Linux) if [ -f /fsckoptions ]; then fsckoptions=`cat /fsckoptions` ... fi # # if [ -e "/proc/ide/${disk[$device]}/media" ] ; \ then hdmedia=`cat /proc/ide/${disk[$device]}/media` ... fi # # if [ ! -n "`uname -r | grep -- "-"`" ]; then ktag="`cat /proc/version`" ... fi # # if [ $usb = "1" ]; then sleep 5 mouseoutput=`cat /proc/bus/usb/devices \ 2>/dev/null|grep -E "^I.*Cls=03.*Prot=02"` kbdoutput=`cat /proc/bus/usb/devices \ 2>/dev/null|grep -E "^I.*Cls=03.*Prot=01"` ... fi |
La sostituzione di comando consente di impostare una variabile con l'output di un ciclo. La chiave per far ciò consiste nel racchiudere l'output del comando echo all'interno del ciclo.
Esempio 11-2. Generare una variabile da un ciclo
#!/bin/bash # csubloop.sh: Impostazione di una variabile all'output di un ciclo. variabile1=`for i in 1 2 3 4 5 do echo -n "$i" # In questo caso il comando 'echo' è done` #+ cruciale nella sostituzione di comando. echo "variabile1 = $variabile1" # variabile1 = 12345 i=0 variabile2=`while [ "$i" -lt 10 ] do echo -n "$i" # Ancora, il necessario 'echo'. let "i += 1" # Incremento. done` echo "variabile2 = $variabile2" # variabile2 = 0123456789 # E' dimostrato che �possibile inserire un ciclo #+ in una dichiarazione di variabile. exit 0 |
La sostituzione di comando permette di ampliare la serie degli strumenti a disposizione di Bash. Si tratta semplicemente di scrivere un programma, o uno script, che invii il risultato allo stdout (come fa un ben funzionante strumento UNIX) e di assegnare quell'output ad una variabile.
|
Nella sostituzione di comando, la forma $(COMANDO) ha preso il posto di quella con gli apostrofi inversi.
La sostituzione di comando nella forma $(...) gestisce la doppia barra inversa in modo diverso che non nella forma `...`.
La sostituzione di comando nella forma $(...) consente l'annidamento. [3]
O, qualcosa di più elaborato . . . Esempio 11-3. Trovare anagrammi
|
Esempi di sostituzione di comando negli script di shell:
[1] | Nella sostituzione di comando il comando può essere rappresentato da un comando di sistema, da un builtin interno a uno script o, addirittura, da una funzione dello script. | |
[2] | In senso tecnicamente più corretto, la sostituzione di comando estrae lo stdout di un comando riassegnandolo successivamente ad una variabile usando l'operatore =. | |
[3] | In realtà, l'annidamento è possibile anche con gli apostrofi inversi, effettuando, però, l'escaping di quelli interni, come ha evidenziato John Default.
|