shell编程基础——分支结构

基本语法

1、if-then语句
if command
then
    commands
fi
2、if-then-else语句
if command
then
    commands
else    
    commands
fi
3、嵌套if语句
if command
then
    commands
elif command2
then    
    commands
fi
4、case语句
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac

注:bash shell的if语句会运行if行定义的那个命令。如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他什么值,那then部分的命令就不会被执行。

test命令

test命令提供了在if-then语句中测试不同条件的途径。如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0,位于then部分的命令就会被执行。如果条件不成立,test命令就会退出并返回退出状态码1。

使用语法如下:

if test condition
then
    commands
fi 
或者
if [ condition ]
then
    commands
fi 

注:condition与左右方括号之间均有一个空格

test命令可以判断3类条件:

1、数值比较
比较描述
n1 -eq n2检查n1是否与n2相等
n1 -ge n2检查n1是否大于或等于n2
n1 -gt n2检查n1是否大于n2
n1 -le n2检查n1是否小于或等于n2
n1 -lt n2检查n1是否小于n2
n1 -ne n2检查n1是否不等于n2

2、字符串比较
比较描述
str1 = str2检查str1是否与str2相同
str1 != str2检查str1是否与str2不同
str1 < str2检查str1是否比str2小
str1 > str2检查str1是否比str2大
-n str1检查str1长度是否非0
-z str1检查str1长度是否为0

注1:大于和小于号必须用’\’进行转义
注2:大于小于顺序和sort命令采用的不同,test命令会使用标准的ASCII顺序


3、文件比较
比较描述
-d file检查file是否存在并是一个目录
-e file检查file是否存在
-f file检查file是否存在并是一个文件
-r file检查file是否存在并可读
-s file检查file是否存在并非空
-w file检查file是否存在并可写
-x file检查file是否存在并可执行
-0 file检查file是否存在并属当前用户所有
-G file检检查file是否存在并且其所属组与当前用户的默认组相同
file1 -nt file2检查file1是否比file2新
file1 -ot file2检查file1是否比file2旧

注:对于-G file,假设用户同时属于group1和group2这2个组,默认组为group1,如果file所属组为group2,则-G file测试条件是不满足的,因为比较的是默认组,虽然用户也属于group2,但是group2不是用户的默认组。


复合条件测试

if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算可用:

  • [ condition1 ] && [ condition2 ]
  • [ condition1 ] || [ condition2 ]

if-then的高级特性

使用双圆括号

格式如下:
(( expression ))

术语expression可以是任意的数学赋值或比较表达式。除了test命令使用的标准数学运算符,下表列出了双圆括号命令中会用到的其他运算符。

符号描述
val++后增
val–后减
++val先增
–val先减
!逻辑求反
~按位取反
**幂运算
<<左位移
>>右位移
&按位与
&&逻辑与

例如:

#!bin/bash
val1=10
if (( $val1 ** 2 > 90 ))
then
    (( val2 = $val1 ** 2 ))
    echo "The square of $val1 is $val2"
fi

输出结果为:
The square of 10 is 100

注:不需要将双圆括号中表达式里的大于号转义。


使用双方括号

双方括号命令提供了针对字符串比较的高级特性。

格式如下:
[[ expression ]]

双方括号里的expression使用了test命令中采用的标准字符串进行比较。但它提供了test命令未提供的另一个特性——模式匹配。在模式匹配中,你可以定义一个正则表达式来匹配字符串值。

#!/bin/bash
if [[ $USER == a* ]]
then 
    echo "Hello $USER"
else
    echo "Sorry, I do not know you"
fi

双方括号命令匹配了$USER环境变量来看它是否以字母a开头。如果是的话,比较就会通过。

注:如上所示,if与双圆括号以及if与双方括号之间必须要有空格

参考:《Linux命令行与shell脚本编程大全(第2版)》

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值