Linux Shell使用while循环读取文件时报command not found错误
问题根源
你当前的写法错误地将纯文本文件fulllist.txt作为可执行程序调用:
Shell 中管道符|的作用是将左侧命令的标准输出传递给右侧命令,你在管道左侧直接填写了文本文件的路径,触发了Shell的执行逻辑,系统会尝试把这个txt文件当成脚本运行,自然会把文件内的内容TEST识别为待执行的指令,由此产生你遇到的报错。
正确解决方案
优先推荐使用输入重定向的写法,该写法不会额外创建子shell,循环内部修改的变量可以在循环结束后被外部正常调用:
#!/bin/bash while IFS= read -r sub ; do # 此处编写你需要对变量$sub执行的处理逻辑 done < /path.../fulllist.txt
如果你确实需要使用管道写法,需要先通过cat命令读取文件内容作为管道的输入:
#!/bin/bash cat /path.../fulllist.txt | while IFS= read -r sub ; do # 此处编写你需要对变量$sub执行的处理逻辑 done
注意:管道写法会为while循环创建独立的子shell,循环内部定义、修改的变量无法在循环结束后被外部代码访问,仅在无跨循环变量传递需求时使用。
额外注意事项
- 如果文件路径包含空格、特殊字符,建议用双引号包裹路径,避免解析错误,示例:
< "/home/user/my files/fulllist.txt" - 如果需要过滤文件中的空行,可以在读取前追加过滤逻辑,比如
grep -v '^$' /path.../fulllist.txt | while ...
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

