Si desidera utilizzare "$ @" (quotato in dollari) per passare i parametri a un pedice. Così ....
ls-color.sh:
#!/bin/bash
/bin/ls --color=auto "$@" # passes though all CLI-args to 'ls'
Quanto al perché .....
Dalla pagina man di Bash :
$*- Si espande ai parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie, si espande in una singola parola con il valore di ogni parametro separato dal primo carattere della variabile speciale IFS. Cioè, "$*"è equivalente a
"$1c$2c..." , dove c è il primo carattere del valore della variabile IFS. Se IFS non è impostato, i parametri sono separati da spazi. Se IFS è nullo, i parametri vengono uniti senza che intervengano separatori.
$@- Si espande ai parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie, ogni parametro si espande in una parola separata. Cioè, "$@"equivale a "$1" "$2" ...Se l'espansione tra virgolette si verifica all'interno di una parola, l'espansione del primo parametro viene unita alla parte iniziale della parola originale e l'espansione dell'ultimo parametro viene unita all'ultima parte dell'originale parola. Quando non ci sono parametri posizionali
"$@"e non si $@espandono a nulla (cioè vengono rimossi).
Configurazione di alcuni script demo ...
echo 'echo -e "\$1=$1\n\$2=$2\n\$3=$3\n\$4=$4"' > echo-params.sh
echo './echo-params.sh $*' > dollar-star.sh
echo './echo-params.sh $@' > dollar-at.sh
echo './echo-params.sh "$*"' > quoted-dollar-star.sh
echo './echo-params.sh "$@"' > quoted-dollar-at.sh
chmod +x *.sh
"$@" - quoted-dollar-at è un file trasformazione dell'identità per ritrasmettere argomenti a una subshell (~ 99% delle volte, questo è ciò che intendevi fare):
./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2=
# $3= 'cc cc'
# $4= "ddd ddd"
"$*" - quotato-dollaro-stella rompe gli argomenti in una singola stringa (~ 1% delle volte in cui si desidera effettivamente questo comportamento, ad esempio in un condizionale :)if [[ -z "$*" ]]; then ...:
./quoted-dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa 'cc cc' "ddd ddd"
# $2=
# $3=
# $4=
$* / $@ - senza virgolette, entrambe le forme rimuovono un livello di virgolette e interpretano gli spazi dalle stringhe sottostanti ma ignorano i caratteri delle virgolette (quasi sempre, questo è un errore):
./dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2= 'cc
# $3= cc'
# $4= "ddd
./dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2= 'cc
# $3= cc'
# $4= "ddd
Se vuoi divertirti un po ', puoi usare "$ @" per annidare le cose nella profondità che desideri, spingendo e facendo scoppiare gli elementi dallo stack degli argomenti, se lo desideri.
function identity() {
"$@"
}
set -x
identity identity identity identity identity echo Hello \"World\"
# + identity identity identity identity identity echo Hello '"World"'
# + identity identity identity identity echo Hello '"World"'
# + identity identity identity echo Hello '"World"'
# + identity identity echo Hello '"World"'
# + identity echo Hello '"World"'
# + echo Hello '"World"'
# Hello "World"