Nor*_*wap 12 arrays bash shell ifs
我(!!)
对以下示例中标记的行感到惊讶:
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
Run Code Online (Sandbox Code Playgroud)
以下是我对行为的理解:
${X[*]}
并${X[@]}
扩大到a b
"${X[*]}"
扩展到 "a|b"
"${X[@]}"
扩展到 "a" "b"
$*
和$@
具有相同的行为${X[*]}
和${X[@]}
,除了它们的含量为程序或函数的参数这似乎是由bash手册证实的.
log1 "${X[*]}"
因此,在该行中,我希望引用的表达式扩展为"a | b",然后传递给log1函数.该函数有一个显示的字符串参数.为什么会发生其他事情?
如果您的答案得到手动/标准参考的支持,那就太酷了!
IFS
不仅用于连接元素${X[*]}
,还用于分割不带引号的扩展$@
.对于log1 "${X[*]}"
,发生以下情况:
"${X[*]}"
扩展到a|b
预期,因此$1
设置为a|b
内部log1
.$@
(未引用)展开时,结果字符串为a|b
.|
作为分隔符(由于全局值IFS
),因此echo
接收两个参数,a
和b
.那是因为$IFS
设置为|
:
(X='a|b' ; IFS='|' ; echo $X)
Run Code Online (Sandbox Code Playgroud)
输出:
a b
Run Code Online (Sandbox Code Playgroud)
man bash
说:
IFS内部字段分隔符,用于扩展后的单词拆分...