从内联命令检查文件名是否存在

zet*_*tah 3 bash

我有一个名为 input.txt 的文件,其中包含以下内容:

...
文件“Edie - Realities.txt”TXT
...

我想读取它,然后从以 FILE 开头的行中删除文件名路径,并检查它是否存在,因此:

[ -f $(cat input.txt | grep FILE | grep -o "\".*\"") ] && echo "exist" || echo "does not exist"

但这输出:

[: too many arguments  
does not exist
Run Code Online (Sandbox Code Playgroud)

如果我运行:

echo $(cat input.txt | grep FILE | grep -o "\".*\"")
Run Code Online (Sandbox Code Playgroud)

我得到了我的期望:

"Edie - Realities.txt"
Run Code Online (Sandbox Code Playgroud)

那么为什么会这样,或者我该如何解决这个问题?

gle*_*man 9

您需要将参数引用到-f-- 如果您运行,set -x您会看到正在执行的命令是[ -f '"Edie' '-' 'Realities.txt"' ]参数太多。

[ -f "$(sed -e '/FILE/!d' -e 's/FILE "\([^"]*\).*/\1/' input.txt)" ]
Run Code Online (Sandbox Code Playgroud)

如果您的系统上有 GNU grep,您可以使用:

[ -f "$(grep -Po '(?<=FILE ").*(?=")' input.txt)" ] 
Run Code Online (Sandbox Code Playgroud)