bash中计算可执行文件返回值的复杂锥函数



我们可以在[[ ]](( ))类型的方括号中生成一些复杂的条件语句。

例如:

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

最新更新