bash - 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/\?//' )
谢谢!
解决方案
要正确读取文件,请使用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以获取有关这些问题的自动警告。
推荐阅读
- python - 似乎无法发现如何向 Pygame 添加碰撞
- docker - 如何从容器外部调整/编辑/添加/更改 kafka docker 容器参数
- java - Java中的向上转换/向下转换
- firebase - Firebase/Google 分析 28 天用户数不匹配 `session_start` 28 天用户数
- java - 如何在 Java 中捕获异常并继续处理?
- python - 无法定位元素://*[@id="US-6"] with xpath
- python - 颜色图不适用于 scipy.griddata 生成的图
- c++ - 基于宏传入字符串的条件编译
- nginx - 为什么会发生“请求实体太大”的错误?
- google-tag-manager - 谷歌标签管理器数据层永远不会被清除