【问题标题】:character missing when reading from file in shell script从 shell 脚本中的文件读取时缺少字符
【发布时间】:2021-12-21 00:33:18
【问题描述】:

在 shell 脚本中,我尝试使用 while 循环逐行读取文件,但字符 'n' 在所有行中都替换为空格。

这里是 cat namespaces.tx 的输出

     cat namespaces.txt
default
kube-node-lease
kube-public
kube-system
name
mane
mann

这是从 while 循环读取时打印的输出

while IFS=$'\n' read -r line; do echo $line; done < namespaces.txt
default
kube- ode-lease
kube-public
kube-system
ame
ma e
ma

【问题讨论】:

  • 请将echo "$SHELL"file namespaces.txt 的输出添加到您的问题中(无评论)。
  • 您可以使用 hexdump(1) 或十六进制编辑器来查看原始文件真正包含的内容。看起来很可疑……
  • 我的猜测是脚本在 bash 以外的 shell 下运行,并且 IFS 在脚本的其他地方也被设置为 $'\n'。脚本是否有 shebang,你是如何运行它的?脚本中是否还有其他涉及IFS 的内容?此外,至少对于read 而言,将IFS 设置为换行符没有多大意义,因为read 将换行符视为行终止符,因此它永远不会出现在一行中。
  • 刚才看到了:IFS=$... 很奇怪(而且可能是错误的)!
  • @Cyrus here is out of echo "$SHELL" echo "$SHELL" /bin/bash file namespaces.txt namespaces.txt: ASCII text

标签: bash shell unix


【解决方案1】:
while IFS= read -r line; do
    echo "$line"
done < namespaces.txt

这是一次读取和打印一行的正确方法。 "$line" 被引用,IFS 可以设置为空。

在您的脚本中检查 IFS=\n 或类似名称。在某处,您已将IFS 设置为包含n。然后,当您打印不带引号的 $line 时,它会被 IFS (n) 拆分为多个单词,并且 echo 打印给它的每个单词,中间有一个空格。

【讨论】:

  • 感谢@Dan 这有效。我考虑了一下,但我认为它会将其拆分为字符“n”处的新数组元素。我对IFS不太了解,可能在某个地方搞砸了。再次感谢你
猜你喜欢
  • 2012-10-06
  • 1970-01-01
  • 2019-09-05
  • 2018-08-10
  • 2011-08-24
  • 2012-12-28
  • 1970-01-01
  • 2016-02-02
相关资源
最近更新 更多