bash 中脚本语句的求值顺序是什么?

Jho*_*hon 2 shell-script

从左到右?或相反亦然?

例子:

If [! -z "$ foo"] && [$ foo2 -eq 0]; then
    echo "something"
fi
Run Code Online (Sandbox Code Playgroud)

首先进行什么评估?

[! -z "$ foo"]
Run Code Online (Sandbox Code Playgroud)

或者

[$ foo2 -eq 0]
Run Code Online (Sandbox Code Playgroud)

谢谢!

Kus*_*nda 7

在 shell 脚本中说

if [ ! -z "$foo" ] && [ "$foo2" -eq 0 ]; then
    echo 'something'
fi
Run Code Online (Sandbox Code Playgroud)

第一个测试[ ! -z "$foo" ](最好写成[ -n "$foo" ])将首先运行。只有在第一个测试成功时才会运行第二个测试。如果两个测试都成功,意思$foo是一个不为空的值并且$foo2有一个等于零的算术值,那么echo将被执行。

&&操作就像在其它语言类似的运营商。shell 实现短路评估,并且&&如果左侧为true,则只会评估右侧。

if也可以在不使用if关键字的情况下编写此特定语句,如

[ ! -z "$foo" ] && [ "$foo2" -eq 0 ] && echo 'something'
Run Code Online (Sandbox Code Playgroud)

虽然使用if ...; then ...; fi恕我直言更清楚。

同样,echo只有前面的两个测试都成功时才会执行。