我无法理解这个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"
)
答案 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
。它的退出状态是整个表达的“价值”。