如何处理命令参数中的异常文件名?

How do I deal with unusual filenames in a command's parameters?

提问人:Tom 提问时间:8/8/2022 最后编辑:E_net4Tom 更新时间:8/11/2022 访问量:66

问:

我有一个文件(“列表”),其中包含大量文件名,其中包含各种字符组合,例如:

-sensei

我正在使用以下脚本来处理此文件列表:

#!/bin/bash
while read -r line
do
    html2text -o ./text/$line $line
done < list

这给了我“无法打开输入文件”错误。 处理这些文件名的正确方法是什么,以防止任何错误?

我已经更改了上面的示例列表,现在只包含一个文件名(在许多文件中),无论我如何引用或不引用它,它都不起作用。

#!/bin/bash
while read -r line
do
    html2text -o "./text/$line" "$line"
done < list

我得到的错误是:

Unrecognized command line option "-sensei", try "-help".

因此,这个问题并不能解决此问题。

bash 转义 引号

评论

1赞 Barmar 8/8/2022
引用所有变量。
0赞 Gordon Davisson 8/9/2022
shellcheck.net 将指出此处缺少的引号,以及许多其他常见的脚本错误。
2赞 E_net4 8/10/2022
这似乎被视为一个选项,而不是一个位置参数。有帮助吗?"$line"html2texthtml2text -o "./text/$line" -- "$line"
0赞 Tom 8/11/2022
@E_net4thecommentflagger 谢谢,这可能有效。但是我发现,当文件名的第一个字符是破折号时,您需要在它前面使用 ./。

答:

-1赞 Tenobaal 8/8/2022 #1

您确定文件存在吗?通常,您的脚本应该没有问题。例如:

#!/bin/bash
while read -r line
do
    touch ./text/$line
done < $1
ls -l /tmp/text

对我来说效果很好(使用您的示例输入)。Bash 应该为你逃避它们。你在正确的目录中吗?如果您确定文件存在,则 html2text 有问题。

此外,请确保输入文件中没有尾随空行。

2赞 Fravadona 8/11/2022 #2

像这样的东西应该可以解决你的问题(除非文件列表有 CRLF 行结尾):

while IFS='' read -r file
do
    html2text -o ./text/"$file" -- "$file"
done < filelist.txt

笔记:

  • IFS='' read -r当您想要准确捕获线条时,是必需
  • 大多数命令都支持发出选项结束的信号;无论以下参数是什么,它们都不会被视为选项。顺便说一句,以 开头的文件名的另一个常见解决方法是在它们前面添加。---./