Linux 如何在bash中正确打印读取行

Linux 如何在bash中正确打印读取行,linux,bash,sed,Linux,Bash,Sed,在尝试迭代纯文本文件时,我有一种奇怪的行为: #!/bin/bash sed -n "5,5p" test.tmp while read linea in do echo $linea done < test.tmp 我附上这两个文件是为了帮助澄清这里发生的事情: 脚本: 输入数据: 提前感谢我会做什么: #!/bin/bash while IFS= read -r linea; do printf '%s\n' "$linea" done < <(

在尝试迭代纯文本文件时,我有一种奇怪的行为:

#!/bin/bash
sed -n "5,5p" test.tmp
while read linea in
do 
    echo $linea
done < test.tmp
我附上这两个文件是为了帮助澄清这里发生的事情:

  • 脚本:
  • 输入数据:
提前感谢

我会做什么:

#!/bin/bash

while IFS= read -r linea; do 
    printf '%s\n' "$linea"
done < <(sed -n "5,5p" test.tmp)
#/bin/bash
而IFS=读取线性A;做
printf'%s\n'$linea'

完成后,我终于找到了发生的事情。while语句中有一个额外的“in”。也许我混合了两种不同的口味

我曾经:

当你在读linea的时候 做 回声线 完成 应改为:

读线性####在删除和删除中;新增 做 回声线 完成
再次感谢

如果在空白处拆分行。重新定义它,以便只使用换行符分隔输入
echo$linea
,首先,与
echo“$linea”
相比,它添加了大量的错误,或者更好的是--
printf“%s\n'$linea”
。除此之外,请参阅BashFAQ 1,了解正确读取输入的全面讨论:还有,您的
sed
命令读取文件并将输出写入stdin——但是您的
while
循环迭代原始文件,而不是
sed
的输出。首先,非常感谢您的回答。很明显,我必须深入学习脚本,但我只需要几年编写一次脚本,我什么都忘了。我只是想澄清一下我的帖子。sed命令只是命令的一个示例,它按照我的预期工作,以显示特定的行,我不希望它作为循环的输入。我明天会检查这是否有效。。。脚本语法在使用多年后对我来说仍然是个谜…需要清除
IFS
,并使用
-r
参数来
读取
,才能完全准确。实际上,这会去除尾随的空格(或其他
IFS
字符),并将反斜杠转义序列处理为它们的关联字符。此外,
printf“%s\n'$linea”
的角位大小写将少于
echo
;考虑行为只包含<代码> -n>代码>。您可能应该提到<代码> ->代码>,即使在这种情况下不需要。<代码> ECHO——“$LIAEA”<代码>,与POSIX兼容,将打印文字字符<代码> -/COD>;与printf中的相同
;这就是为什么我建议不要在这两种情况下使用它。
#!/bin/bash

while IFS= read -r linea; do 
    printf '%s\n' "$linea"
done < <(sed -n "5,5p" test.tmp)