开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
经过前面的学习,都只是对文件的操作,下面总结一下必不可少的流程控制.
您能在这里看到啥
- 命令执行状态
- 条件表达式
if语句
命令执行状态
在我编写解放双手系列工具的时候,经常会遇到一个问题.我怎么去判断当前命令是否执行成功呢.一开始,确实不太懂,经过我的不懈努力.总算找了.往下看
比如我们执行删除文件指令.rm test.txt,我们知道是否执行成功,有两个写法.
/// 第一种
vt=rm test.txt
if $vt; then
echo "删除成功"
else
echo "删除失败"
fi
/// 第二种
rm test.txt
if [[ $? == 0 ]]; then
echo "删除成功"
else
echo "删除失败"
fi
从上面的代码,我们可以得到.要判断命令是否执行成功,可以通过$?这个值,进行判断.当然你也可以按照我的第一种方式,把命令的执行结果,赋值给一个变量,然后判断变量状态即可.
条件表达式
-
条件表达式理解
条件表达式: 判断表达式是否正确的逻辑表达式.
条件成立: 0
条件不成立: 1
-
语法
test命令[ 表达式 ][[ 表达式 ]](( 表达式 ))
注意: 第二种和第三种.两边需要有空格.经验之谈,因为我在写解放双手系列的时候,可不少因为这个空格,导致 ! 提示.
结合操作符,我们简单举例说明一下上面的语法.
-
操作符
这里我们简单记录一下,平时用的操作符
-
文件状态操作符
文件状态操作符 含义 -d文件为目录.则为真 -f文件为普通文件.则为真 -r文件可读.则为真 -w文件可写.则为真 -u文件的SUID位被设置.则为真 -s文件长度 >0.则为真-x文件可执行.则为真 -
数字操作符
数字操作符 含义 -eq相当于 ==-ne相当于 !=-lt相当于 <-gt相当于 >-le相当于 <=-eq相当于 >= -
逻辑操作符
逻辑操作符 含义 -a相当于 与-o相当于 或-!相当于 非
-
-
命令
-
test命令# 检测cdn文件是否是目录文件 test -d cdn && echo 0 || echo 1 0 -
[ ]命令[]是bash的内部命令,和test是一样的.比较运算符只能用==和!=,不能整数判断,只能用字符串比较.如果你想比较数字,需要使用数字操作符.并且有一个小细节.在[]中,如果使用另一个sh文件定义的参数的时候,参数需要""来包裹的.- 创建ts.sh
#!/bin/bash name=ts - 创建tst.sh
/// 引入ts.sh文件 source ts.sh [ "$name" == 1 ] # 检测cdn文件是否是目录文件 [ 1 -eq 2 ] && echo 0 || echo 1 1
- 创建ts.sh
-
[[ ]]命令[[ ]]支持字符串的模式匹配.可以使用=~操作符并且支持正则表达式.当我们使用字符串比较的时候,可以把判断条件右边的作为一个表达式(模式).不只是字符串.入下所示- 正则表达式
name="a" [[ $name == [a-z] ]] && echo "字母" || echo "不是" "字母" =~正则匹配name="my name is demo" [[ $name =~ d ]] && echo Y || echo N在
[[ ]]中使用>和<时,系统会进行排序操作.并且支持&&和||.在test和[]是不支持的.当然在[[ ]]中,获取其他文件的参数是可以不用""包裹的
- 正则表达式
总结
条件 [ ][[ ]]正则匹配 不支持 支持 <不支持 支持,并作排序操作 >不支持 支持,并作排序操作 ==字符匹配 模式匹配 与和或&&和 “//”-a和-o变量 如果变量没有定义,那么需用双引号引起来 不需要 -
if语句
-
单分支结构
只有条件成立才会执行对应逻辑,否则不执行任何操作
name="shell" if [ $name == "shell" ]; then echo "单分支结构" fi -
双分支结构
如果条件成立执行对应逻辑,不成立,则执行不成立的对应逻辑
name="shell" if [ $name == "shell" ]; then echo "单分支结构" else echo "双分支结构" fi -
多分支结构
可以嵌套无数个双分支结构
name="shell" if [ $name == "s" ]; then echo "单分支结构" else if [ $name == "t" ];then echo "双分支结构" else if [ $name == "shell" ];then echo "多分支结构" else echo "就这吧" fi