gpt4 book ai didi

arrays - 令人惊讶的数组扩展行为

转载 作者:行者123 更新时间:2023-11-29 08:49:26 24 4
gpt4 key购买 nike

我对以下示例中标记为 (!!) 的行感到惊讶:

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 函数。该函数有一个显示的字符串参数。为什么会发生其他事情?

如果您的答案有手册/标准引用支持,那就太好了!

最佳答案

IFS 不仅用于连接 ${X[*]} 的元素,还用于拆分未引用的扩展 $@。对于 log1 "${X[*]}",会发生以下情况:

  1. "${X[*]}" 按预期扩展为 a|b,因此 $1 设置为 a |blog1 中。
  2. $@(未加引号)展开时,结果字符串为 a|b
  3. 未加引号的展开以|为分隔符进行分词(由于IFS的全局值),因此echo收到两个参数,ab

关于arrays - 令人惊讶的数组扩展行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31676918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com