脚本
FILE="/u0146121/bin/list.txt"
while read line; do
echo $line
done < $FILE
我是 Bash 脚本的新手,正在尝试弄清楚这个 while 循环。我想逐行读取文本文件,然后执行命令。
我不断收到错误:
No such file or directory121/bin/list.txt
有人知道如何解决这个问题吗?
答案1
我怀疑您的脚本可能有 DOS 样式的行尾。在 DOS(和 Windows)中,文本文件的每一行都以回车符(以 或 表示\r
)结尾^M
,后跟换行符(\n
或^J
)。另一方面,Unix 文本文件的每一行都以换行符结尾。如果您给 unix 工具(如 bash)一个 DOS 格式的文件,它会将回车符解释为行的一部分,并且会感到非常困惑。在这种情况下,在我看来,FILE 实际上被设置为/u0146121/bin/list.txt^M
,但它并不存在,当 shell 报告问题时,回车符会使终端感到困惑,错误消息的结尾会打印在开头的顶部。
要进行检查,请尝试使用 -- 打印脚本,cat -v /path/to/script
如果在行尾看到 ^M,则说明文件为 DOS 格式。您的系统可能有一个命令来翻译它,但命令名称会有所不同(例如,可能是dos2unix
或fromdos
或...)。如果找不到相关命令,可以使用这个简单的 perl 脚本:
perl -pi -e 's/\r//g' /path/to/script
答案2
您可能没有向我们展示您正在做什么。错误消息是
No such file or directory121/bin/list.txt
这表明$FILE
包含121/bin/list.txt
而不是/u0146121/bin/list.txt
所以我只能猜测你实际上并没有运行FILE="/u0146121/bin/list.txt"
但是FILE="121/bin/list.txt"
。
无论如何,尝试在不定义变量的情况下运行它以查看它是否有效:
while read line; do
echo $line;
done < /u0146121/bin/list.txt
答案3
尝试
FILE="/u0146121/bin/list.txt"
while read line; do
echo $line
done < cat $FILE