lis="a:b:c:d:"
IFS=:
如果我运行以下代码,
for i in "a:b:c:d:";
do
echo the output is $i
done
我得到:
the output is a b c d
如果我用 $lis 替换“a:b:c:d:”:
for i in $lis;
do
echo the output is $i
done
我有预期的输出:
the output is a
the output is b
the output is c
the output is d
我想知道出了什么问题,$lis 基本上与“a:b:c:d”相同
答案1
最大的区别在于分词的位置。双引号确保文字字符串或带引号的变量"$lis"
将被视为单个项目
for i in "a:b:c:d:";
do
echo the output is $i
done
因此,在此循环中,双引号"a:b:c:d:"
是单个项目,因此您只看到一行输出
the output is a b c d
for i in $lis;
do
echo the output is $i
done
这里的$lis
未加引号,因此 shell 将根据IFS
您设置的值执行分词。 shell 将看到有 4 个项目提供给 for 循环。这就是为什么你会看到四行输出。
如果您使用双引号"$lis"
变量,则不会执行分词,因此您应该看到与第一种情况相同的输出(只有一行)。