bash - IFS改变for循环中echo -n的行为

时间:2016-06-05 04:47:15

标签: bash

我的代码需要for循环内的响应。

在循环之前,我设置了IFS="\n"

忽略循环echo -n(最后一行除外)。

注意:这只是echo -n

行为的一个示例

示例:

   IFS='\n'
    for line in `cat file`
    do
    echo -n $line
    done

输出:

  
      
  1. 这是一个测试
  2.   
  3. 这是一个测试
  4.   
  5. 这是一个测试$
  6.   

用户提示仅在最后一行的末尾发生。

为什么会发生这种情况并且有解决方法?

2 个答案:

答案 0 :(得分:6)

IFS='\n'$IFS都未将\设置为换行符;相反,他们将其设置为 literal n,然后是 literal IFS=$'\n'

您必须使用ANSI C-quoted string才能分配实际换行符:\n;或者,您可以使用包含实际换行符的正常字符串文字(跨越2行)。

分配文字 cat file会导致$IFS的输出分成行,因为实际换行不存在于\;可能 - 虽然没有您的示例文件内容 - 但输出可能已被嵌入的nfor字符拆分为字段。
如果没有,整个文件内容会立即传递,从而导致while IFS= read -r line; do echo -n "$line" done < file 循环的次迭代。

那就是说,你在文件中循环的方法是ill-advised;尝试类似以下内容:

int a[3][3]

答案 1 :(得分:0)

在bash中解析文件时,切勿使用for循环。请改用while循环。这是一个非常好的教程。

http://mywiki.wooledge.org/BashFAQ/001