Vous voulez utiliser "$ @" (dollar cité à) pour passer des paramètres à un indice. Ainsi ....
ls-color.sh:
#!/bin/bash
/bin/ls --color=auto "$@" # passes though all CLI-args to 'ls'
Quant à savoir pourquoi .....
Depuis la page de manuel Bash :
$*
- S'étend aux paramètres de position, à partir de un. Lorsque l'expansion se produit entre guillemets doubles, elle se développe en un seul mot avec la valeur de chaque paramètre séparée par le premier caractère de la variable spéciale IFS. Autrement dit, "$*"
équivaut à
"$1c$2c..."
, où c est le premier caractère de la valeur de la variable IFS. Si IFS n'est pas défini, les paramètres sont séparés par des espaces. Si IFS est nul, les paramètres sont joints sans séparateurs intermédiaires.
$@
- S'étend aux paramètres de position, à partir de un. Lorsque le développement se produit entre guillemets, chaque paramètre se développe en un mot distinct. Autrement dit, "$@"
équivaut à "$1" "$2" ...
Si l'expansion entre guillemets doubles se produit dans un mot, l'expansion du premier paramètre est jointe à la partie de début du mot d'origine et l'expansion du dernier paramètre est jointe à la dernière partie de l'original mot. Lorsqu'il n'y a pas de paramètres de position,
"$@"
et $@
étendre à rien (c'est-à-dire qu'ils sont supprimés).
Configuration de certains scripts de démonstration ...
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 est une transformation d'identité pour renvoyer des arguments à un sous-shell (~ 99% du temps, c'est ce que vous vouliez faire):
./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2=
# $3= 'cc cc'
# $4= "ddd ddd"
"$*"
- quoted-dollar-star écrase les arguments en une seule chaîne (~ 1% du temps où vous voulez réellement ce comportement, par exemple dans un conditionnel:) if [[ -z "$*" ]]; then ...
:
./quoted-dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa 'cc cc' "ddd ddd"
# $2=
# $3=
# $4=
$*
/ $@
- sans guillemets, les deux formulaires suppriment un niveau de citation et interprètent les espaces des chaînes sous-jacentes mais ignorent les caractères de citation (presque toujours, c'est une erreur):
./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
Si vous voulez vous amuser, vous pouvez utiliser "$ @" pour imbriquer les choses aussi profondément que vous le souhaitez, en poussant et en faisant sauter des éléments de la pile d'arguments si vous le souhaitez.
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"