我们可以在[[ ]]
或(( ))
类型的方括号中生成一些复杂的条件语句。
例如:
a=3;b=4;c=4
if [[ 1 == 1 && ( ( $a == $b && 1 == 1 ) || ( $b == $c && 2 == 2)) ]];
then echo yes;
else echo no;
fi
如果我们使用返回错误的可执行命令来考虑与此等效的方法,我不确定如何继续。在'和'的链的例子中,这是微不足道的:
if echo hello | grep -q "h" && stat /etc/os-release 2>/dev/null;
then echo yes;
else echo no;
fi
如果我有一些分支呢?就像我举的第一个例子一样。
问题本质上归结为如何创建命令组?我在第一个条件中使用的括号似乎只在[[ ]]
块内部起作用。
顺便问一句,我在这里的做法愚蠢吗?我知道我可以用一堆"如果"的语句来做我想做的事,但我觉得这看起来很难看。
我试图做的事情的本质是基于对变量的评估,用一个分支依次执行一系列检查。
非常感谢
如果我有一些分支呢?
if [[ 1 == 1 && ( ( $a == $b && 1 == 1 ) || ($b == $c && 2 == 2) ) ]];
为了澄清,这里没有(( ))
"类型"括号,也就是说,这里没有发生算术扩展,也没有执行let
内建。现在,让我们将1 == 1
替换为true
,将$a == $b
替换为"cmd1",并将$b == $c
替换为cmd2
,我们可以:
if true && { { cmd1 && true; } || { cmd2 && true; }; }; then
根据bash手册,有两种方法可以对命令进行分组:
((
(列表(
将命令列表放在括号之间会导致要创建的子shell环境(请参阅命令执行环境(,以及列表中要在其中执行的每个命令潜艇外壳。由于列表是在子shell中执行的在子shell完成后,赋值不会继续有效。{}
{list;}
将命令列表放在大括号之间会导致要在当前shell上下文中执行的列表。没有潜艇外壳创建。以下列表中的分号(或换行符(是必需的。
if中的条件和then .. fi
子句中的表达式之间没有语法差异-两者都是表达式,并被解析为bash命令。所以你可以嵌套它们:
if
if true; then
cmd1
else
cmd2
fi
then
cmd3
fi