Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个IF条件的Bash Shell语法问题_Bash_Shell_Unix - Fatal编程技术网

具有多个IF条件的Bash Shell语法问题

具有多个IF条件的Bash Shell语法问题,bash,shell,unix,Bash,Shell,Unix,我对单IF子句语句中的多个条件感到困惑 如果我使用下面的语法,它会抛出错误 if [[ [ "$a" == "" && "$b" != "" ] && [ "$b" == "" ] ]]; then echo 1; else echo 2; fi -bash:[:缺少“%]” 但如果我只更换[内部条件],其工作如下所示 if [[ ( "$a" == "" && "$b" != "" ) && ( "$b" == "" )

我对单IF子句语句中的多个条件感到困惑

如果我使用下面的语法,它会抛出错误

if [[ [ "$a" == "" && "$b" != "" ] && [ "$b" == "" ] ]]; 
then echo 1; 
else echo 2; 
fi
-bash:[:缺少“%]”

但如果我只更换[内部条件],其工作如下所示

if [[ ( "$a" == "" && "$b" != "" ) && ( "$b" == "" ) ]]; 

有人能说为什么它如此令人困惑,为什么它是这样设计的吗?我对不同类型的大括号的用法感到困惑[.何时使用[何时不使用]。

哪一种对你来说更容易?“困惑”位实际上是[这是一个历史上的程序,尽管很久以前在shell中实现过,并且有/有..限制[[是对表达式(包括括号)的高级支持的'special bash'。只需使用[[bash_expression_with_Branchers_here]]生活就会好起来。因为[必须保持与旧shell行为的兼容性][[是bash语法,较新/更强大且特定于bash-在本例中,提供了预期的语法,您需要分别使用-a和-o,而不是&&和| |[也称为test can be.@chepner虽然在这种情况下可以删除显式分组,但它不允许在逻辑运算符周围使用括号,也不允许干净地表示a | | b&&c。您仍然可以对测试进行分组:{a;}|{b&&c},其中a、b和c是测试命令。