代码之家  ›  专栏  ›  技术社区  ›  Lone Learner

IFS=:在冒号分隔的值上循环时会导致不同的行为

  •  12
  • Lone Learner  · 技术社区  · 7 年前

    这是我在名为 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背后的规则和导致 这不同的输出?

    1 回复  |  直到 6 年前
        1
  •  15
  •   janos slartidan    7 年前

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


    为了了解发生了什么, 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

    让我们看看这个逻辑在你的例子中是如何发挥作用的。

    实验1

    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 .

    实验2

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

    foo:bar:baz

    未对文字执行分词 foo:bar:baz , 至于 对于

    在对值进行参数扩展后执行分词 , 国际单项体育联合会 这就是 <space><tab><newline> 但是自从 不包含任何这些, 它保持不变,因此输出为 foo:bar:baz

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

    foo
    bar
    baz

    参数扩展后 $var , , 所以 对于 foo bar baz 的行为 回响


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

    字符串文字很像用双引号括起来的表达式,您不会期望在 "..." .

    推荐文章