我正在阅读有关bash内部变量的内容,并遇到了这个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]
CASE2
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|||
,并将 |
视为 空格
。我使用以下方式进行了检查:Noob@Noob:~/tmp$ IFS=$':' FOO=$":a::b:c:::"; echo $FOO $'x'
a b c x
因此,我对第二种情况的预期输出是:
# []
# [a]
# []
# []
# [b]
# [c]
# []
# []
# []
那么,有人能在内部解释一下bash如何处理第二种情况中的var
,以及我对此理解哪里出了问题吗。
printf "[%s]\n" $var
替换。 - Mark Reedvar
变量时使用bash -x
命令分割的情况。请参考我回答中的编辑。 - c00kiemon5ter