【shell漫步】3 条件分支结构

2024-01-07 17:24:03

碎碎念

接上文的运算符的内容,这一章终于开始接触控制结构

【shell漫步】2 运算符-CSDN博客

分支结构的写法

当我们要对不同情况采取不同措施的时候就要用到分支结构

在shell中分支结构的写法如下

if [ 情况1 ]
then
    代码1
elif [ 情况2 ]
then
    代码2
elif [ 情况3 ]
then
    代码3
...以此类推
fi

接下来以收快递为例子来解释一下语法结构,假如我有一个邮政快递,我这样子告诉快递员:

如果我在家,则放我家门口,那么代码这样:(其中 if 后面跟着情况或者条件,then后面跟着在这种情况下对应的代码,在条件分支的最后一行一定要用 fi 作为结束的标志)

if 我在家
then
    放家门口
fi

但是我一想,如果我在上班的话怎么办,于是我又跟快递员补充一句:

如果我不在家,帮我送到我的公司来,从第二个条件开始就不写 if 而是 elif 作为开头

那么代码如下

if 我在家
then
    放家门口
elif 我不在家
then
    放公司
fi

如果有第三个条件,第四个条件,第五个条件....

他们的写法都是和第二个条件的写法一样

elif 条件 then 代码??就可以了

如果以上条件都不满足的话,默认就不执行任何操作,快递员将不会派送这个包裹,但是如果我们要指定默认操作的话,可以使用else

if 我在家
then
    放家门口
elif 我不在家
then
    放公司
else
then
    放快递点
fi

这就表明了,不管我前面指定了1种情形或者100种情形,只要不满足前面的任何一种情形的话,就帮我执行 else 这个分支的动作就行了

条件的写法

在shell中,条件的写法比较麻烦,有四种写法

[ 条件 ]? ? ? [[ 条件 ]]? ?( 条件 )? ?(( 条件?))

写法1? if [ 条件 ]

最基础的写法,可以在里面使用关系运算,布尔运算,字符串运算

除此之外算术运算符,逻辑运算符 以及高级用法都不行

但是在 if 和括号之间,括号和条件之间一定要有空格!否则会报错

如下,逻辑运算符? ||? 就报错了?

写法2 if [[ 条件 ]]

和写法1相比,写法2可以支持?关系运算符,布尔运算符,逻辑运算符,正则表达式

可以看到逻辑运算符被正确识别了,而且还支持高级功能比如正则表达式,字符串匹配等,目前还没接触正则表达式也完全不用慌,正则表达式在不同的命令中使用不同的方式使用,遇到具体的命令的时候去查怎么使用就可以了(比如百度一下? grep? 中怎么用正则表达式就可以了)现在重要的是理解写法2 可以使用高级功能,也就是说如果不确定使用哪一种写法的时候使用写法2更安全

正则表达式速攻1/2-CSDN博客

写法3? if ( 条件 )

小括号中的条件是一条命令,比如常见的 mkdir ,touch 等

每一个命令执行之后都会有两种结果,成功或者失败

只要成功的话都会返回一个 0 作为成功的信号

因此我们就可以根据? 命令是否成功? 这一标志作为条件

比如说: 如果touch命令执行成功的话,打印“命令执行成功”的信息

那么代码就是这样的

if ( touch newfile )
then
    echo "命令执行成功"
else
    echo "命令执行失败"
fi

写法4? if (( 条件 ))

写法2中哪怕支持了很多的运算符和高级的字符串匹配等功能,仍然还是没有处理计算的能力

如果一定要处理数学计算的话,就要使用双重小括号的写法,在双重小括号中可以使用熟悉的数学表达法,比如 ==? ? <? ? >? ? <=? ? ?>=? ? ?+? ? ? -? ? ? *? ? ? /? 等

但是注意,双重小括号能够支持算术运算,反而不支持关系运算,这两个运算就跟老冤家一样(晕)

最后想总结一下四种条件的写法

算术运算关系运算字符串运算逻辑运算其他操作
[? ? ]
[[? ? ?]]字符串匹配
(? ? )执行命令的结果
((? ? ))

并且布尔运算目前只有取反功能还在使用,取反功能是大家都支持的所以就不写了

顺便回忆一下之前的一个内容:在shell中 0 代表true,代表成功,1代表false,代表失败

所以 if ( 命令 )的写法中

一旦命令执行成功一定会返回0,而 if 判断 0 为真,所以执行下面的代码

ps? 手头可以写代码的话可以尝试写一下 if 0? ?或者先设 a=0 然后写一下? if $a

按照上面说的,if 收到命令成功后返回的 0? 值,就会判定为true,然后执行代码

既然如此,直接写 if 0 会不会也判定为true然后执行代码? 如果不能的话是为什么?

这也是个很有趣的解密游戏

祝大家玩得开心

文章来源:https://blog.csdn.net/andyshi1998/article/details/135428445
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。