在以下示例中,我已经对标有(!!)的行感到惊讶:
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 [@]}都扩展为b
>“${X [*]}”扩展为“a | b”
>“${X [@]}”扩展为“a”“b”
> $*和$@与${X [*]}和${X [@]}具有相同的行为,除了它们的内容是程序或函数的参数
这似乎得到了bash manual的证实.
在行log1“${X [*]}”中,因此我期望引用的表达式展开为“a | b”,然后传递给log1函数.该函数具有显示的单个字符串参数.为什么会发生其他事情?
如果您的答案是手动/标准参考的支持,那将会很酷!
IFS不仅用于加入${X [*]}的元素,还用于拆分未引用的扩展$@.对于log1“${X [*]}”,会发生以下情况:
>“${X [*]}”按预期展开为| b,所以$1设置为log1内的一个| b.>当$@(未引用)被扩展时,生成的字符串是一个| b.>无争议的扩张与…分开作为分隔符(由于IFS的全局值),所以echo接收两个参数a和b.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。