将管道输出传递给测试命令

2 bash if-statement sed echo test-command

test我对命令语法感到困惑。我的目标是检查文件是否存在,但由sed命令形成的文件路径。

所以,我尝试,例如:

echo '~/test111' | sed s/111/222/g | test -f && echo "found" || echo "not found"
Run Code Online (Sandbox Code Playgroud)

但该命令总是返回“found”。我究竟做错了什么?

fed*_*qui 5

按照目前的方法,您只是说:

test -f && echo "yes" || echo "no"
Run Code Online (Sandbox Code Playgroud)

由于test -f默认返回 true,因此您总是得到“yes”:

$ test -f
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

正确的语法是test -f "string"

所以你想说:

string=$(echo '~/test111'|sed 's/111/222/g')
test -f "$string" && echo "found" || echo "not found"
Run Code Online (Sandbox Code Playgroud)

可以压缩为:

test -f "$(echo '~/test111'|sed 's/111/222/g')" && echo "found" || echo "not found"
Run Code Online (Sandbox Code Playgroud)

但它失去了可读性。

您还可以使用xargs前一个管道给出的名称执行给定的操作:

echo '~/test111'|sed 's/111/222/g' | xargs test -f && echo "found" || echo "not found"
Run Code Online (Sandbox Code Playgroud)