我有一个 bash 脚本的问题,它应该遍历 ready.txt 文件中的每一行,该文件存储了文件的路径,然后对它们做一些事情,比如在这种情况下 rm -f
ready.txt 内容:
'/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI2.pdf'
'/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI4.pdf'
'/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI6.pdf'
我的循环应该删除这些文件,但没有这样做。
while read -r line;
do
rm -f $line
done < ready.txt
我手动测试过:
export line='/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI2.pdf'
rm -f $line
或:
rm -f '/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI2.pdf'
我测试的这两个都按预期工作,但循环不想要。
我是 bash 脚本的新手。我错过了什么吗?
答案 0 :(得分:0)
我错过了什么吗?
在此处发布之前使用 http://shellcheck.net 检查您的脚本。
假设输入文件包含:
/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI2.pdf
/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI4.pdf
/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI6.pdf
引用每个变量扩展以防止分词:
rm -f "$line"
很可能 rm -f $line
在您的 shell 中“有效”,因为您使用的是 zsh,而不是 bash,而在脚本中您使用的是 bash 或 sh。
还有 read -r line
将删除前导和尾随空格。使用:
while IFS= read -r line
有关更多信息,请研究分词、在 shell 中何时以及如何使用引号、双引号与单引号的区别。另见https://mywiki.wooledge.org/BashFAQ/001。
要对文件的每一行执行一个命令,请使用 xargs
,通常:
xargs -d '\n' rm < ready.txt
答案 1 :(得分:0)
它不起作用,因为文件名在您的输入文件 ready.txt
中包含单引号(除非实际文件名确实包含引号,我对此表示怀疑),因为 rm
找不到此类文件。< /p>
您需要删除它们:
while read -r line;
do
rm -f "${line//\'}"
done < ready.txt