【发布时间】:2015-10-19 01:04:50
【问题描述】:
我对以下示例中标记为 (!!) 的行感到惊讶:
log1 () { echo $@; }
log2 () { echo "$@"; }
X=(a b)
IFS='|'
echo ${X[@]} # prints a b
echo "${X[@]}" # prints a b
echo ${X[*]} # prints a b
echo "${X[*]}" # prints a|b
echo "---"
log1 ${X[@]} # prints a b
log1 "${X[@]}" # prints a b
log1 ${X[*]} # prints a b
log1 "${X[*]}" # prints a b (!!)
echo "---"
log2 ${X[@]} # prints a b
log2 "${X[@]}" # prints a b
log2 ${X[*]} # prints a b
log2 "${X[*]}" # prints a|b
这是我对行为的理解:
-
${X[*]}和${X[@]}都扩展为a b -
"${X[*]}"扩展为"a|b" -
"${X[@]}"扩展为"a" "b" -
$*和$@与${X[*]}和${X[@]}具有相同的行为,只是它们的内容是程序或函数的参数
bash manual似乎证实了这一点。
因此,在log1 "${X[*]}" 行中,我希望引用的表达式扩展为“a|b”,然后传递给 log1 函数。该函数有一个显示的字符串参数。为什么会发生其他事情?
如果您的答案有手册/标准参考资料支持,那就太好了!
【问题讨论】: