首页 > 解决方案 > Bash不会在for循环中打印带有问号的字符串

问题描述

我有一个包含以下内容的文本文件,

My test
strings
that dont have
a question 
mark except this line?
but not
these two

当我尝试使用 bash 读取文件时,例如,

ph_lines="/path/to/file.txt"
for l in $(cat "$ph_lines") 
do
    echo "$l"
done

除了带有问号的字符串之外,所有内容都打印在输出上。

我试过使用while read line; echo line; done < $filename它仍然有同样的问题

唯一可以捕获所有行的方法是当我使用 sed 删除问号时。

for l in $(cat ${ph_lines} | sed $'s/\?//' )

谢谢!

标签: bashfor-loopechofile-read

解决方案


要正确读取文件,请使用Read a file line by line 中的示例,将值分配给变量

while IFS= read -r line; do
    echo "$line"
done < my_filename.txt

不同之处不是它是一个 while 循环(因为你已经尝试过了),而是因为这个循环被正确引用了。您看到的问题是因为您nullglob先秘密启用,然后忽略引用:

$ shopt -s nullglob
$ var='question?'

$ echo "$var"
question?

$ echo $var
(blank line)

不带引号的扩展会导致路径名扩展,并且由于您启用nullglob并且没有匹配的文件,因此前面的示例什么也没有显示。如果你有一些匹配的文件,你会看到那些:

$ touch questions question2

$ echo $var
question2 questions

您可以在编辑器中设置shellcheck以获取有关这些问题的自动警告。


推荐阅读