评估/ bin / sh中的逻辑表达式链

时间:2015-02-13 10:20:53

标签: sh

我无法理解这个posix shell代码是如何工作的。

my_dir=/tmp/foo_dir
[ -d $my_dir ] || mkdir -p $my_dir || echo "Error creating '$my_dir'!"

考虑目录不存在的情况。

如果目录不存在,

-d返回零,那么" mkdir"被评估。

mkdir成功后返回零,这应该导致" echo"正在评估中。然而,此代码有效(echo仅在目录创建失败时打印,方法是将my_dir更改为/ttmp/foo_dir"

1 个答案:

答案 0 :(得分:1)

在posix shell中,0表示成功,其他值表示失败。当我们在逻辑表达式中使用命令时,我们正在测试它的退出状态。我们可以使用$?来检查上次退出状态。

试验:

$ true
$ echo $?
0
$ false
$ echo $?
1
$ [ -d tmpdir ]
$ echo $?
1
$ mkdir tmpdir
$ echo $?
0
$ mkdir tmpdir
mkdir: tmpdir: File exists
$ echo $?
1
$ mkdir -p tmpdir
$ echo $?
0
$ [ -d tmpdir ]
$ echo $?
0

如您所见,-d在目录存在时返回0(成功),否则返回1。同样,mkdir在成功创建目录时返回0,如果不成功则返回1,但mkdir -p不认为该文件已存在为错误。

问题是||是一个短路运营商。只需要执行所需的操作。因此,例如,在true || echo Hello中,echo Hello永远不会被执行,因为||的左侧始终为真。 &&也是一个短路运算符,false && echo Hello永远不会执行echo Hello,因为运算符的左侧始终为false。

记住这一切,很容易看出它是如何工作的:

  • 如果目录存在,-d返回0(成功),其余操作数不需要评估(由于短路行为)
  • 如果目录不存在,则-d返回1(失败)并执行mkdir -p
    • 如果目录已成功创建(请记住mkdir -p如果目录已存在则不返回错误),mkdir -p将返回0(成功)并且echo msg未执行(由于短路行为)
    • 如果未成功创建目录,mkdir -p将返回1(失败)并评估echo msg。它的退出状态是整个表达的“价值”。