【问题标题】:Bash doesn't respect newline in command substitution with catBash 在用 cat 替换命令时不尊重换行符
【发布时间】:2017-09-29 18:56:20
【问题描述】:

假设我们有一个文件 list.txt:

line 1
line 2

如果我使用这个:

for line in $(cat list.txt)
do 
echo $line"_"
done

即使我这样做:

OLD_IFS=$IFS
$IFS='$'

我明白了:

line1
line2_

而不是:

line1_
line2_

我该如何解决这个问题?

【问题讨论】:

  • 你为什么要和IFS搞这个琐碎的工作?
  • IFS='$' (不要使用$ 进行分配)会导致文字美元符号上的分词;这不是正则表达式。
  • for 循环永远不适合遍历文件的行;见mywiki.wooledge.org/BashFAQ/001
  • 另见Why you shouldn't read lines with for。并且随时链接到您获得现有实践的地方 - bash 标签中有很多错误信息/不良内容;如果您引起我们的注意,我们可以尝试纠正它。
  • 如果你真的只是想附加一个下划线,你也可以使用sed 's/$/_/' list.txt

标签: bash command newline substitution cat


【解决方案1】:

忽略您的错误分配$IFS='$'$ 并不意味着换行、换行或换行。这意味着文字美元符号。

要分配换行符,请使用

IFS=$'\n'

但是,不要尝试使用它来遍历行。相反,请使用 while read 循环,它不会扩展 glob 或折叠空行:

while IFS= read -r line
do
  echo "${line}_"
done < file

或者有类似的好处,用mapfile将这些行读入一个数组:

mapfile -t lines < file
for line in "${lines[@]}"
do
  echo "${line}_"
done

【讨论】:

  • $IFS='$' 老实说,我在这里找到了另一个答案
  • @Salvio 另一个答案可能是$ IFS='$',其中第一个$ 旨在显示交互式shell 提示符。它不应该是脚本的一部分。否则,只是错误的。这是无效的语法。
  • @Salvio 如果这里有一个答案建议IFS='$' 在换行符上拆分,这是非常严重的错误,应该修复。你能指出来吗?
猜你喜欢
  • 1970-01-01
  • 2017-01-29
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 2013-02-17
相关资源
最近更新 更多