是否可以组合两个 Linux 条件?

Is it possible to combine two Linux conditions?

在Linux中,您可以执行简单的命令行条件,例如。

echo 'The short brown fox' | grep -q 'fox' && echo 'Found' || echo 'Not Found'

>> Found

test -e test.txt && echo 'File Exists' || echo 'File Not Found'
>> File exists

是否可以将两个条件合二为一?因此,如果找到了狐狸,我们会查看文件是否存在,然后相应地执行条件。

我尝试了以下方法,但它们似乎不起作用:

echo 'The short brown fox' | grep -q 'fox' && (test -e test.txt && echo 'File Exists' || echo 'File Not Found') || echo 'Fox Not Found'

echo 'The short brown fox' | grep -q 'fox' && `test -e test.txt && echo 'File Exists' || echo 'File Not Found'` || echo 'Fox Not Found'

我需要命令在一行中执行。

是啊!您可以像这样使用 and 和 or 运算符:

echo "The short brown fox" | grep fox && echo found || echo not found

如果你也想抑制 grep 的输出以便你只看到 "found" 或 "not found",你可以这样做:

echo "The short brown fox" | grep fox >/dev/null && echo found || echo not found

&&运算符和||运算符短路,所以如果echo "The short brown fox" | grep fox >/dev/nullreturn一个真实的退出代码(0),那么echo found将执行,并且由于 return 的退出代码为 0,因此 echo not found 将永远不会执行。

类似地,如果 echo "The short brown fox" | grep fox >/dev/null return 是错误的退出代码 (>0),则 echo found 根本不会执行,而 echo not found 会执行。

您可以使用 { ...; } 将 shell 中的多个命令分组,如下所示:

echo 'The short brown fox' | grep -q 'fox' &&
{ [[ -e test.txt ]] && echo "file exists" || echo 'File Not Found'; } || echo 'Not Found'

大括号内的所有命令,即 { ...; } 将在 grep 成功时执行,而 { ...; } 外的 || 被评估为 grep 失败.


编辑:

这是 csh 一个班轮做同样的事情:

echo 'The short brown ox' | grep -q 'fox' && ( [ -e "test.txt" ] && echo "file exists" || echo 'File Not Found' ; ) || echo 'Not Found'

不要这样组合 ||&&;使用明确的 if 语句。

if echo 'The short brown fox' | grep -q 'fox'; then
    if test -e test.txt; then
        echo "File found"
    else
        echo "File not found"
    fi
else
    echo "Not found"
fi
如果 a 成功且 b 失败,则

a && b || c 不等价(尽管您可以使用 a && { b || c; },但 if 语句更具可读性) .