gpt4 book ai didi

bash - IFS= : leads to different behavior while looping over colon-separated values

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

实验一

这是我在名为 foo.sh 的文件中的第一个脚本。

IFS=:
for i in foo:bar:baz
do
echo $i
done

这会产生以下输出。

$ bash foo.sh
foo bar baz

实验二

这是我的第二个脚本。

IFS=:
for i in foo:bar:baz
do
unset IFS
echo $i
done

这会产生以下输出。

$ bash foo.sh
foo:bar:baz

实验三

这是我的第三个脚本。

IFS=:
var=foo:bar:baz
for i in $var
do
echo $i
done

这会产生以下输出。

$ bash foo.sh
foo
bar
baz

为什么三种情况下的输出都不一样?你能解释一下吗IFS 解释背后的规则和导致的命令这种不同的输出?

最佳答案

我发现这是一个非常有趣的实验。谢谢你。


要了解正在发生的事情,man bash 的相关部分是这样的:

  Word Splitting      The  shell  scans the results of parameter expansion, command substitu-      tion, and arithmetic expansion that did not occur within double  quotes      for word splitting.

关键是“......的结果”部分,它非常微妙。也就是说,分词发生在某些操作的结果上,如那里所列:参数扩展的结果,命令替换的结果,等等。不对 foo:bar:baz 等字符串文字执行分词。

让我们看看这个逻辑如何在您的示例上下文中发挥作用。

实验一

IFS=:
for i in foo:bar:baz
do
echo $i
done

这会产生以下输出:

foo bar baz

没有对文字 foo:bar:baz 进行分词,所以 IFS 的值是多少并不重要,就 for 循环而言。

$i的值进行参数扩展后进行分词,所以 foo:bar:baz 被分成 3 个词,并传递给 echo,因此输出为 foo bar baz

实验二

IFS=:
for i in foo:bar:baz
do
unset IFS
echo $i
done

这会产生以下输出:

foo:bar:baz

再一次,没有对文字 foo:bar:baz 执行分词,所以 IFS 的值是多少并不重要,就 for 循环而言。

$i的值进行参数扩展后进行分词,但由于 IFS 未设置,它的默认值用于执行拆分,即 。但是由于 foo:bar:baz 不包含任何这些,它保持完整,因此输出为 foo:bar:baz

实验三

IFS=:
var=foo:bar:baz
for i in $var
do
echo $i
done

这会产生以下输出:

foobarbaz

$var参数展开后,使用IFS的值进行分词,因此 for 有 3 个值可以迭代,foobarbazecho 的行为在这里很简单,每行输出一个单词。


底线是:不对文字值执行分词。分词只对某些操作的结果进行。

这并不奇怪。字符串文字很像用双引号括起来的表达式,您不会期望在 "..." 上进行分词。

关于bash - IFS= : leads to different behavior while looping over colon-separated values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46313746/

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