一个例子:
foo() {
for i in ${@+"$@"}; do
echo $i
done
}
我知道这${parameter+word}
会导致word
ifparameter
设置的扩展。但是为什么不直接使用for i in "$@"; do
呢?我敢肯定有一些好处,但任何人都可以举个例子吗?
谢谢!
根据 POSIX 标准,如果未设置,"$@"
则应扩展为空。$@
但是,原始的 Bourne shell 将其扩展为单个空字符串。如果未在任一 shell 中设置,${@+"$@"}
则将扩展为空。$@
资料来源: http: //www.in-ulm.de/~mascheck/various/bourne_args/
when$@
是一个空字符串""
,${@+"$@"}
什么都不产生,但是"$@"
产生""
,检查它:
foo() {
for i in ${@:+"$@"}; do
echo XXX: $i
done
}
bar() {
for i in "$@"; do
echo XXX: $i
done
}
echo foo:
foo ""
echo bar:
bar ""
foo
不叫回声,而是bar
叫它