【问题标题】:what does IFS='' or IFS= means?IFS='' 或 IFS= 是什么意思?
【发布时间】:2021-11-29 06:59:11
【问题描述】:

IFS 用作分词字符,但是当 IFS 为空/空时会发生什么。 例如,考虑输入文件 abc.txt 的内容

first line
second line

现在,如果我运行

IFS='' # or IFS= or assume IFS is null
for word in $(cat abc.txt)
do
 echo ${word}
done

那么输出就是

first line
second line

注意,在 output 中,显示了两行。 现在,问题是为什么出现两条线而不是一条? 如果没有 IFS 被用作分词字符,那么我猜输出应该是

first line second line

输出不应该只在一行中吗,因为此时 \n 也不是 IFS?

【问题讨论】:

  • 它没有在换行符处拆分是正确的,但为什么要drop换行符?它是您的word 的一部分。
  • 是您的朋友,好好利用它。您找到的帖子如下:unix.stackexchange.com/questions/184863/…
  • 你假设循环体执行了两次:它没有。

标签: bash shell sh ifs


【解决方案1】:

您设置了 IFS,但设置为空值。

假设您使用的是符合 POSIX 标准的外壳,如果 IFS 为空,则按照 IEEE Std 1003.1, 2004(对POSIX.1-2001 的小更新)部分2.6.5 Field Splitting 说:

如果IFS的值为null,则不进行字段拆分。

因此,您实际上并没有遍历这些行,而只是一次打印所有内容。如果相关,请注意 unsetting IFS 将有一个非常不同的行为(使其表现得好像填充了默认值,空格/制表符/换行符)。

【讨论】:

    【解决方案2】:

    abc.txt 的全部内容在循环的第一次迭代中被分配给word,包括每行末尾的换行符。这些换行符是echo 参数的一部分,它会将它们写入标准输出。

    您的循环只执行一次,对echo 的单个调用写入从文件中读取的两行。

    (将declare -p word 添加到循环体中,以在唯一一次迭代中查看word 的完整值。)

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 1970-01-01
      • 2011-05-06
      • 2017-01-25
      • 1970-01-01
      • 2019-10-05
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多