目录
条件测试语句
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0(真true)时表示成功,返回值为非0值(假false)时表示失败或异常。
test命令
可以对特定条件进行测试,并根据返回值来判断条件是否成立($?返回值为 0 表示条件成立)。
- 测试表达式是否成立,若成立返回0,否则返回其它数值
格式1:test 条件表达式
格式2:[ 条件表达式 ]
[ 操作符 文件或目录 ]
- 常用的测试操作符
-d: 测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
- 案例
[root@localhost~]# [ -d /media/cdrom ] #返回0表示条件成立
[root@localhost~]# echo $?
0
[root@localhost~]# [ -d /media/cdrom/Server ] #返回1表示条件不成立
[root@localhost~]# echo $?
1
[root@localhost~]# [ -d /media/cdrom ] && echo "YES" # $$表示逻辑与,“而且”的意思
YES
[ 整数1 操作符 整数2 ]
-
常用的测试操作符
-eq:等于(Equal) -ne:不等于(Not Equal) -gt:大于(Greater Than) -lt:小于(Lesser Than) -le:小于或等同于(Lesser or Equal) -ge:大于或等于(Greater or Equal)
-
案例
[root@localhost~]# who | wc -l #查看当前系统中的用户数 7 [root@localhost~]# [ $(who | wc -l) -gt 5 ] && echo "Too many." #用户数是否 > 5 Too many. [root@localhost~]# [ $(who | wc -l) -gt 10 ] && echo ">=10." #用户数是否 >=10
[root@localhost ~]# free -m #查看当前内存使用情况,显示单位为MB total used free shared buff/cache available Mem: 1758 762 415 10 580 769 Swap: 4095 0 4095 [root@localhost ~]# free -m |grep "Mem" | awk '{print $4}' #将free -m 下面Mem这一行的 415 第四列打印出来 [root@localhost ~]# ABC=$(free -m |grep "Mem" | awk '{print $4}') [root@localhost ~]# echo $ABC #将打印结果复制给ABC 414 [root@localhost ~]# [ $ABC -lt 1500 ] && echo "当前内存为${ABC}MB,请及时清理内存!" 当前内存为414MB,请及时清理内存! #数值比较,如果小于1500则输出提示信息
三、bc浮点运算
bash 不支持浮点运算,如果需要进行浮点运算,需要借助bc,awk 处理。
#!/bin/bash
#加 [root@localhost ~]# f=$(echo "4.3+2.5" | bc) [root@localhost ~]# echo "4.3+2.5=$f" 4.3+2.5=6.8 #减 [root@localhost ~]# f=$(echo "4.3-2.5" | bc) [root@localhost ~]# echo "4.3-2.5=$f" 4.3-2.5=1.8 #乘 [root@localhost ~]# f=$(echo "4.30*2.50" | bc) [root@localhost ~]# echo "4.3*2.5=$f" 4.3*2.5=10.75 #除 [root@localhost ~]# f=$(echo "4.3/2.5" | bc ) [root@localhost ~]# echo "4.3/2.5"=$f 4.3/2.5=1 #混合运算 [root@localhost ~]# f=$(echo "4.3/(2.2-1.1)*2.5+1.1" | bc) [root@localhost ~]# echo "4.3/(2.2-1.1)*2.5+1.1"=$f 4.3/(2.2-1.1)*2.5+1.1=8.6 #管道符号读文件运算 [root@localhost ~]#echo "2+2" >13.txt [root@localhost ~]#cat 13.txt | bc 4
四、awk浮点运算
#加 [root@localhost ~]#f=$(awk 'BEGIN {print 1.1+2.2}') [root@localhost ~]#echo "1.1+2.2=$f" 1.1+2.2=3.3 #减 [root@localhost ~]#f=$(awk 'BEGIN {print 2.2-1.1}') [root@localhost ~]#echo "2.2-1.1"=$f 2.2-1.1=1.1 #乘 [root@localhost ~]#f=$(awk 'BEGIN {print 1.1*2.2}' ) [root@localhost ~]#echo 1.1*2.2=$f 1.1*2.2=2.42 #除 [root@localhost ~]#f=$(awk 'BEGIN {print 10/2 }') [root@localhost ~]#echo "10/2=$f" 10/2=5
#还可以这样: #加 [root@localhost ~]#echo $(awk BEGIN'{print 10+5}') 15 #减 [root@localhost ~]#echo $(awk BEGIN'{print 10-5}') 5 #乘 [root@localhost ~]#echo $(awk BEGIN'{print 10*5}') 50 #除 [root@localhost ~]#echo $(awk BEGIN'{print 10/5}') 2
[root@localhost ~]#F=`free -m | grep "Mem:" | awk '{print$4/$2*100}'` [root@localhost ~]#echo ${F}% #查看Mem:这行,第四列free空闲除以第一列total 23.5495% #算出还有38%没存
格式1:[ 字符串1 = 字符串2 ] 或 [ 字符串1 == 字符串2 ] [ 字符串1 != 字符串2 ] 格式2:[ -z 字符串 ] #检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串 [ -n 字符串 ] #检查是否有字符串存在
- 常用的测试操作符
=:字符串内容相同 !=:字符串内容不同,!号表示相反的意思 -z:字符串内容为空
- 案例
[root@localhost ~]# echo $LANG zh_CN.UTF-8 [root@localhost ~]# [ $LANG!="en.US" ] && echo "Not en.US" #测试当前语言环境 Not en.US
[root@localhost ~]# read -p "是否覆盖现有文件(yes/no)?" ACK 是否覆盖现有文件(yes/no)?yes [root@localhost ~]# [ $ACK="yes" ] && echo "覆盖" #测试读入的字符是否为 yes 覆盖
[root@localhost ~]#read -p "我是不是帅哥:yes/no" ack 我是不是帅哥:yes/no yes [root@localhost ~]#echo $ack yes [root@localhost ~]#[ $ack = "yes" ] && echo "帅哥" #比较这两边的字符串,如果一直则 帅哥 输出相应结果,否则不输出 [root@localhost ~]#[ $ack != "no" ] && echo "帅哥" 帅哥 [root@localhost ~]#[ -z $ack ] && echo "帅哥" #因为ack不是空目录所以输出不了 [root@localhost ~]#[ -z $ack123 ] && echo "帅哥" #因为ack123是空目录所以能输出 帅哥
六、逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ... 格式2:[ 命令1 操作符 命令2 ] 在同一个[] 中括号内,使用-a -o ,不同的[]中括号,需要使用&&、|| ```
-
-
常用的操作符
-a或&& :逻辑与,“而且”的意思,前后条件需都成立 -o或|| :逻辑或,“或者”的意思,只需前后条件中一个成立 ! :逻辑否 在这里插入图片描述
[root@localhost ~]#a=9 [root@localhost ~]#[ $a -lt 10 ] && [ $a -gt 5 ] #a小于10 且大于5 [root@localhost ~]#echo $? #显示正确 0 [root@localhost ~]#[ $a -lt 10 ] && [ $a -gt 10 ] #a小于10 且大于10 [root@localhost ~]#echo $? #不成立 显示错误 1 [root@localhost ~]#[ $a -lt 10 ] -o [ $a -gt 10 ] #一个中括号中间放 -o -bash: [: 参数太多 #显示执行不了 [root@localhost ~]#[ $a -lt 10 -o $a -gt 10 ] #一个中括号中间放 -o [root@localhost ~]#echo $? #可以执行 0
&&、||操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错
[root@localhost ~]#[[ $a -lt 10 && $a -gt 5 ]] [root@localhost ~]#echo $? 0 # &&、||操作符能够正常存在于[[]]条件判 [root@localhost ~]#[ $a -lt 10 && $a -gt 5 ] 断结构中,但是如果出现在[]结构中的话会报错 -bash: [: 缺少 `]'
if语句
一、if语句单分支结构
if 条件测试操作
then 命令序列
fi
例:判断挂载点目录,若不存在则自动创建:
二、双分支 if 语句
1. if 条件测试操作
2. then
3. 命令序列 1
4. else
5. 命令序列 2
6. fi
三、多分支 if 语句
1. if 条件测试操作 1
2. then
3. 命令序列 1
4. elif 条件测试操作 2
5. then
6. 命令序列 2
7. [else]
8 [命令序列 3]
9 fi
例题:
提示用户输入考试分数,要求判断分数大于60或小于60,小于分数60的都淘汰,大于60的都过关,并判断男女性别,男生进入男生组,女生进入女生组,输入错误则提示错误。
case语句
case多分枝结构
1. case 变量值 in
2. 模式 1)
3. 命令序列 1
4. ;;
5. 模式 2)
6. 命令序列 2
7. ;;
8. ……
9.
10.*)
11.默认命令序列
12.esac
case语句注意事项
-
case行首必须以单词“in”,每一模式必须以单个右括号")"结束
-
双分号";;"表示命令序列的结束
-
模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以使用竖杠|表示或,比如a|b
- 最后的*)表示默认模式,其中的*相当于通配符
例题:
提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其他字符则提示重新输入,并判断男女性别,男生进入男生组,女生进入女生组,输入错误则提示错误。