您希望使用"$ @"(引用的美元at)将参数传递给下标.像这样....
ls-color.sh:
#!/bin/bash /bin/ls --color=auto "$@" # passes though all CLI-args to 'ls'
从Bash手册页:
$*
- 从1开始扩展到位置参数.当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由IFS特殊变量的第一个字符分隔.也就是说,"$*"
相当于"$1c$2c..."
,其中c是IFS变量值的第一个字符.如果未设置IFS,则参数由空格分隔.如果IFS为null,则连接参数时不会插入分隔符.
$@
- 从1开始扩展到位置参数.当扩展发生在双引号内时,每个参数都会扩展为单独的单词.也就是说,"$@"
相当于"$1" "$2" ...
如果在单词中出现双引号扩展,则第一个参数的扩展与原始单词的开头部分连接,并且最后一个参数的扩展与原始的最后部分连接字.当没有位置参数时,"$@"
并$@
扩展为空(即,它们被移除).
设置一些演示脚本......
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是一个身份转换,用于将args重新传递给子shell(约99%的时间,这就是你的意思):
./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"' # $1= aaa # $2= # $3= 'cc cc' # $4= "ddd ddd"
"$*"
- quoted-dollar-star 将args打成一个字符串 (大约1%的时间你实际上想要这种行为,例如在条件中:)if [[ -z "$*" ]]; then ...
:
./quoted-dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"' # $1= aaa 'cc cc' "ddd ddd" # $2= # $3= # $4=
$*
/ $@
- 没有引号,两个表单都剥离了一个引用级别并解释了底层字符串中的空格但忽略了引号字符(几乎总是,这是一个错误):
./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
如果你想获得一些乐趣,你可以使用"$ @"来嵌入你喜欢的东西,如果你愿意,可以从args堆栈中推出和弹出元素.
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"
#!/bin/bash echo $* bash myecho.sh "$@"
请注意,"$ @"构造不是特定于bash的,并且应该适用于任何POSIX shell(至少使用破折号).另请注意,根据您想要的输出,您根本不需要额外的引用级别.IE只需调用上面的脚本:
./test.sh 1 2 "3 4"