我有
$ IFS=123
$ myvar=abc1def1ghi
$ for i in "$myvar"; do echo i $i; done
i abc def ghi
$ for i in $myvar; do echo i $i; done
i abc
i def
i ghi
$ myvar="abc1def1ghi"
$ for i in "$myvar"; do echo i $i; done
i abc def ghi
$ for i in $myvar; do echo i $i; done
i abc
i def
i ghi
我想我理解在第二和第四循环中发生了什么。但我不明白为什么1没有打印在第1和第3循环。 IFS的整个想法一般让我感到困惑。
答案 0 :(得分:5)
当你说$ var_name时,1会被解释为分隔符,因此你会看到字符串被切成碎片。
$ IFS=123
$ myvar=abc1def1ghi
$ echo $myvar
abc def ghi
当您在变量周围添加引号时,您需要变量的绝对值而不进行任何处理。
$ echo "$myvar"
abc1def1ghi
现在提出您的问题关于第一次循环,
$ for i in "$myvar"; do echo i $i; done
相当于
$ for i in "abc1def1gh1"; do echo i $i; done
'i'被赋予“abc1def1gh1”并打印出变量'i'的值。打印'i'时,此时'1'被解释为分隔符。这是在运行循环时发生的事情:
$ i="abc1def1gh1"
$ echo $i
abc def gh
同样的事情发生在第三循环中。
现在如果您想要打印'1',那么在循环中在$ i周围添加引号。 即。改变这个:
$ for i in "abc1def1gh1"; do echo i $i; done
i abc def gh
到
$ for i in "abc1def1gh1"; do echo i "$i"; done
i abc1def1gh1
答案 1 :(得分:1)
IFS
或内部字段分隔符是一个字符序列,其中每个字符都作为分隔符将结果分成多个部分。要了解输出的差异,我们需要查看{{1} }已应用于字符串。让我们来看第一个:
IFS
如果我们输入每个变量的值,那么这段代码将看起来像这样:
$ IFS=123
$ myvar=abc1def1ghi
$ for i in "$myvar"; do echo i $i; done
i abc def ghi
$ IFS=123
$ myvar=abc1def1ghi
$ for i in "abc1def1ghi"; do echo i abc1def1ghi; done
仅适用于IFS
。因此输出将为echo i abc1def1ghi
。
现在让我们来看第二个:
i abc def ghi
对于上述代码,在放置$ IFS=123
$ myvar=abc1def1ghi
$ for i in $myvar; do echo i $i; done
值时,IFS
将被应用在for loop
的建筑物上,并且代码将如下所示:
myvar
因此$ IFS=123
$ myvar=abc1def1ghi
$ for i in abc def ghi; do echo i $i; done
将迭代3次,输出将是:
for loop
因此,最终结论是由于 i abc
i def
i ghi
上的双引号,$myvar
尚未应用于此。