【问题标题】:IFS=$'\n' deleted the "n"IFS=$'\n' 删除了“n”
【发布时间】:2023-03-08 04:05:02
【问题描述】:

我对“IFS=$'\n' 有疑问。

old_IFS=$IFS
file="Good morning
Good morning
Good morning
Good morning
Good morning"

IFS=$'\n'
for line in $file
    do
       echo $line
done
IFS=$old_IFS

当我执行脚本时:

Good mor
i
g
Good mor
i
g
Good mor
i
g
Good mor
i
g
Good mor
i
g

“n”被删除。 我想逐行查看文件

【问题讨论】:

  • 您使用的是哪个外壳?它是否支持$'...' 字符串语法? (反问句;显然不是。)
  • 如果您在脚本顶部使用#!/bin/sh,请尝试更改为#!/bin/bash#!/bin/ksh。祝你好运。
  • 必须用shell写。我正在使用#!/bin/sh。谢谢。

标签: shell for-loop sh ifs


【解决方案1】:

迭代多行数据(无论您的 shell 是否支持 $'...')的正确方法是使用 while 循环重复调用 read

while read -r; do
    echo "$REPLY"
done <<EOF
$file
EOF

【讨论】:

  • +1 很高兴知道。我注意到REPLY 是 Bash 变量,并非在所有 shell 中都可用。
  • 对,我忘了仔细检查。如果您提供一个特定变量来代替REPLY,您还应该将IFS 设置为空字符串以防止分词(这可能会删除行中的任何前导或尾随空格):IFS= read -r line
【解决方案2】:

正如其他人所指出的,我认为您使用的 shell 不支持 $'...' 语法。

如果您的系统使用 Dash 作为 sh,您应该能够通过将 IFS 分配给一个空的或未分配的变量来将其分配给一个新行。例如,n=""; IFS=$n 将允许您按新行拆分。这是一个 hack,只有在空变量被解释为解释器的新行时才有效。

您还可以使用 &lt;&lt;&lt;word 从 shell (如 Bash)中的 here 字符串中读取。

file="Good morning
Good morning
Good morning
Good morning
Good morning"

while read line; do
    echo $line
done <<<"$file"

否则,您可以逐行读取文件。

while read -r line; do 
    echo "$line"
done < file

【讨论】:

  • 这行不通,但是您可以通过将IFS 放在引号中轻松地将其设置为文字换行符。所以IFS=' 在一行,一个单独的' 在下一行。 (抱歉,cmets 中没有代码格式。)
  • 此外,未引用的$line 仍然存在问题,因为它受通配符扩展的影响;你需要使用"$line"
  • 没问题,请查看我更新的帖子以获得更多解释。
  • ...如果我们不想去掉前导空格,甚至可以成为while IFS= read -r line; do echo "$line"; done &lt;file。取决于我们想要输入的字面量。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2012-04-09
  • 2014-12-12
  • 2014-10-10
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多