碎碎念
接上文的运算符的内容,这一章终于开始接触控制结构
【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 )
thenecho "命令执行成功"
elseecho "命令执行失败"
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然后执行代码? 如果不能的话是为什么?
这也是个很有趣的解密游戏
祝大家玩得开心