【发布时间】:2012-10-17 11:18:46
【问题描述】:
我正在阅读有关 bash internal variables 的信息,并遇到了这个 IFS 示例:
output_args_one_per_line()
{
for arg
do
echo "[$arg]"
done # ^ ^ Embed within brackets, for your viewing pleasure.
}
案例1
IFS=" "
var=" a b c "
output_args_one_per_line $var
#OUTPUT
# [a]
# [b]
# [c]
案例2
IFS=:
var=":a::b:c:::" # Same pattern as above
CASE2
# but substituting ":" for " " ...
output_args_one_per_line $var
# []
# [a]
# []
# [b]
# [c]
# []
# []
现在,根据我的理解,如果 IFS 的值是默认的 \t\n,那么会删除前导和尾随空格。因此,对于 case1,bash 将 var 视为 a b c,因此是输出。
根据我的说法,对于 case2,bash 在此处将 var 视为 |a||b|c||| 将 | 视为 space。我使用
Noob@Noob:~/tmp$ IFS=$':' FOO=$":a::b:c:::"; echo $FOO $'x'
a b c x
所以,我对案例 2 的预期输出是
# []
# [a]
# []
# []
# [b]
# [c]
# []
# []
# []
那么,有人可以在内部向我解释 bash 在情况 2 中如何处理 var 以及我的理解哪里出错了。
【问题讨论】:
-
OT:您的 output_args_one_per_line 函数可以替换为
printf "[%s]\n" $var -
当
var展开时,查看bash -x显示的拆分。请参阅我的答案的编辑。