<Precedenti | Contenuti | Succ.>
Gestione dei parametri posizionali In massa
A volte è utile gestire tutti i parametri posizionali come un gruppo. Ad esempio, potremmo voler scrivere un "wrapper" attorno a un altro programma. Ciò significa creare uno script o una funzione shell che semplifica l'invocazione di un altro programma. Il wrapper, in questo caso, fornisce un elenco di opzioni della riga di comando e quindi passa un elenco di argomenti al programma di livello inferiore.
La shell fornisce due parametri speciali a questo scopo. Entrambi si espandono nell'elenco completo dei parametri posizionali, ma differiscono in modi piuttosto sottili. Sono:
Tabella 32-1: I parametri speciali * e @
Parametro Descrizione
Parametro Descrizione
$* Si espande nell'elenco dei parametri posizionali, a partire da 1. Se racchiuso tra virgolette doppie, si espande in una stringa tra virgolette doppie contenente tutti i parametri posizionali, ciascuno separato dal primo carattere della variabile shell IFS (per impostazione predefinita uno spazio).
$@ Si espande nell'elenco dei parametri posizionali, a partire da 1. Se racchiuso tra virgolette doppie, espande ciascun parametro posizionale in una parola separata racchiusa tra virgolette doppie.
Ecco uno script che mostra questi parametri speciali in azione:
Gestione dei parametri posizionali in massa
#! / Bin / bash
# posit-params3: script per dimostrare $* e $@ print_params () {
echo "\$1 = $1" echo "\$2 = $2" echo "\$3 = $3" echo "\$4 = $4"
}
pass_params () {
echo -e "\n" '$* :'; parametri_di_stampa $* echo -e "\n" '"$*" :'; parametri_di_stampa "$*" echo -e "\n" '$@ :'; parametri_di_stampa $@ echo -e "\n" '"$@" :'; parametri_di_stampa "$@"
}
pass_params "parola" "parole con spazi"
#! / Bin / bash
# posit-params3: script per dimostrare $* e $@ print_params () {
echo "\$1 = $1" echo "\$2 = $2" echo "\$3 = $3" echo "\$4 = $4"
}
pass_params () {
echo -e "\n" '$* :'; parametri_di_stampa $* echo -e "\n" '"$*" :'; parametri_di_stampa "$*" echo -e "\n" '$@ :'; parametri_di_stampa $@ echo -e "\n" '"$@" :'; parametri_di_stampa "$@"
}
pass_params "parola" "parole con spazi"
In questo programma piuttosto contorto, creiamo due argomenti: "parola" e "parole con spazi", e li passiamo al pass_params funzione. Tale funzione, a sua volta, li passa al parametri di stampa funzione, utilizzando ciascuno dei quattro metodi disponibili con i parametri speciali $* e $@Una volta eseguito, lo script rivela le differenze:
[io@linuxbox~]$ posit-param3
$* :
$1 | = | parola |
$2 | = | parole |
$3 | = | con |
$4 | = | spazi |
"$*" :
$1 | = | parola parole con spazi |
$2 | = | |
$3 | = | |
$4 | = |
$@ :
$1 | = | parola |
$2 | = | parole |
$3 | = | con |
$4 | = | spazi |
"$@" :
$1 = parola
$2 = parole con spazi
$ 3 =
$ 4 =
$2 = parole con spazi
$ 3 =
$ 4 =
Con i nostri argomenti, entrambi $* e $@ produce un risultato di quattro parole:
parola parole con spazi
"$*" produce un risultato composto da una sola parola:
"parole con spazi"
"$@" produce un risultato di due parole:
"parola" "parole con spazi"
che corrisponde al nostro intento effettivo. La lezione da trarre da questo è che, anche se la shell fornisce quattro modi diversi per ottenere l'elenco dei parametri posizionali, "$@" è di gran lunga il più utile per la maggior parte delle situazioni, perché preserva l'integrità di ciascun parametro posizionale.