为什么 Bash 测试用例没有一致地反映命令的退出状态?

0 bash

尽管函数处于退出状态,但测试用例还是失败了:

#!/bin/bash

fun() {
    return 0
}
fun && echo "true" || echo "false"                        #result: true
[[ `fun` ]] && echo "true" || echo "false"                #result: false
Run Code Online (Sandbox Code Playgroud)

使用 echo 命令测试我们可以看到退出状态并没有像我们预期的那样改变结果:

#!/bin/bash

echo "orange" 1>/dev/null && echo "true" || echo "false"  #result: true
[[ `echo "orange "` ]] && echo "true" || echo "false"     #result: true

echo 1>/dev/null && echo "true" || echo "false"           #result: true
[[ `echo ` ]] && echo "true" || echo "false"              #result: false
Run Code Online (Sandbox Code Playgroud)

什么会导致这种行为?

gle*_*man 5

使用反引号,您可以获得函数的输出。没有输出。该测试[[ "" ]]为“false”,因为它测试了单个字符串参数的非空性。

查看help testbash 提示符,我们看到:

String operators:

  -z STRING      True if string is empty.

  -n STRING
     STRING      True if string is not empty.   <== this is you
Run Code Online (Sandbox Code Playgroud)