在bash中使用IFS

时间:2012-02-22 03:44:29

标签: linux bash

我有

$ 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的整个想法一般让我感到困惑。

2 个答案:

答案 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尚未应用于此。

相关问题