这个问题已经有了答案:
我有这个bash声明:
if ls > /dev/null 2>&1 -a ls > /dev/null 2>&1; then echo "true"; else echo "false"; fi
这给了我“假”。但我知道 ls 会一直回来的 0 (即正确)。我以为 -a 是一个和声明。
ls
0
-a
当我将此更改为:
if ls > /dev/null 2>&1 && ls > /dev/null 2>&1; then echo "true"; else echo "false"; fi
它起作用了。这里发生了什么不同的事情?是 -A 不是AND运算符?
-A
&& 是在bash中执行短路逻辑和的正确方法。
&&
-a 是一个 test 操作数( 测试 命令是否也命名 [ )。它并不意味着在任何其他上下文中(内置于bash中;它 是 中的谓词 find 例如)。而且, the POSIX specification for test 是否标记为“过时”;搜索 OB 在链接页中。
test
测试
[
find
OB
以上也可以这么说 [ -n "$foo" ] && [ -n "$bar" ] ,或 [[ $foo && $bar ]] ,比 [ -n "$foo" -a -n "$bar" ] .
[ -n "$foo" ] && [ -n "$bar" ]
[[ $foo && $bar ]]
[ -n "$foo" -a -n "$bar" ]