shell编程之程序语句

一.条件测试相关语句

Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0(真true)时表示成功,返回值为非0值(假false)时表示失败或异常。

test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立($?返回值为 0 表示条件成立)。

格式一:test 条件表达式

格式二:[ 条件表达式 ]              #方括号“[”或“]”与条件表达式之间需要至少一个空格进行分隔

(1)文件测试

           test命令

  • test 条件格式表达式
  • [    条件表达式  ]
[root@localhost /]# test 7 = 10
[root@localhost /]# echo $?
1
[root@localhost /]# test 7 = 7
[root@localhost /]# echo $?
0
[root@localhost /]# [ 7 = 7 ]
[root@localhost /]# echo $?
0
[root@localhost /]# [ 7 = 13 ]
[root@localhost /]# echo $?
1
【中括号和运算符号两边都得有空格,若成立返回0,否则返回其他数值】

文件测试

  • 常用的测试操作符
  • 格式:[ 操作符 文件或目录 ]  (不要忘记空格)
操作符说明
-d测试是否为目录,且测试该文件是否存在(Directory)
-e测试是否为文件,且测试该文件是否存在(File)
-f测试该目录或文件是否存在(Exist)
-r测试当前用户是否有权限读取(Read)
-w测试当前用户是否有权限写入(Write)
-x测试当前用户是否有执行权限(eXcute)
[root@localhost]# touch wj                    //创建一个文件
[root@localhost]# mkdir ml                    //创建一个目录
[root@localhost]# ls
ml   wj
[root@localhost]# [ -d ml ] && echo 有       //测试ml是否为目录,"&&"而且通过echo输出结果“有”
有
[root@localhost]# [ -d wj ]
[root@localhost]# echo $?
1
[root@localhost]$ ls -l
总用量 0
drwxr-xr-x. 2 root root 12 5月   4 18:57 ml
--w-------. 1 root root 12 5月   4 18:57 wj
[root@localhost]$ [ -r wj ]
[root@localhost]$ echo $?
1
[root@localhost]$ [ -x wj ]
[root@localhost]$ echo $?
1
//从上方ls可以看出wj文件没有r和x权限,所以返回的值为1

(2)整数值比较

格式:[ 整数1 操作符 整数2 ]

操作符说明
-eq等于(Equal)
-ne不等于(Not Equal)
-gt大于(Greter Than)
-lt小于(Lesser Than)
-ge大于等于(Lesser or Equal)
-le小于等于(Greater or Equal)
[root@localhost ~]# Free=`free -m | grep "Mem:" | awk '{print $4}'`    
【通过grep检索出包含“Men:”的指定字符串并通过awk工具提取出所需的数据。最终使用反撇号提取该命令执行后的输出结果赋值给Free】
[root@localhost ~]# echo $Free
86
[root@localhost ~]# [ $Free -lt 2048 ] && echo ${Free}M 
【Free变量获取出的结果如果小于等于2048则输出变量Free的值,单位为“M”】
86M

(3)字符串与逻辑比较

           字符串测试

格式1:
[  字符串1  =  字符串2 ] 或 [  字符串1  ==  字符串2 ]   #表示字符串1跟字符串2相同
[  字符串1  !=  字符串2 ]    # 表示字符串1跟字符串2 不同

格式2:
[  -z  字符串 ]        #检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串
[  -n  字符串 ]        #检查是否有字符串存在 

操作符说明
=字符串内容相同
!=字符串内容不同,!表示取反的意思
-z字符串内容为空
未定义或者赋予空值的变量将视为空串
-n是否有字符串
[root@localhost etc]# read -p "今天天气好不好?好/不好" abc
[root@localhost ~]# [ $abc = 好 ] && echo "今天天气好"
今天天气好
[root@localhost ~]# [ $abc = 不好 ] && echo "今天天气不好"
今天天气不好
[比较中括号内与后面双引号的两个字符串,如果一致就输出结果,不一致就不输出]

逻辑测试

格式1:[  表达式1  ]  操作符  [  表达式2  ]  
格式2:[命令1  操作符  命令2]

在同一个[] 中括号内,使用-a -o ,不同的[]中括号,需要使用&&、|| 

常用的操作符:
-a或&& :逻辑与,“而且”的意思,前后条件需都成立
-o或|| :逻辑或,“或者”的意思,只需前后条件中一个成立
! :逻辑否
 

[root@localhost ~]# [ $a -ne 1 ] && [ $a != 3 ]  【在两个[]之间用&&或者||】
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ $a -ne 1 -a $a != 2 ]      【在同一个[]之间用-a 或者 -o】
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ 2 -lt 3 ]] && echo yes || no
yes
【因为2小于3的条件成立,且||操作符是第一个条件成立则echo输出第一个值,所以是yes】
[root@localhost ~]# [[ 2 -gt 3 ]] && echo yes || echo no
no
【因为2大于3的条件未成立,所以&&操作符不成立,从而导致echo无法输出“yes”,所以||操作符后面的“no”将被echo输出】
[root@localhost ~]# [ 2 -gt 3 ] && echo yes || echo no && echo pass
no
pass
【因为2大于3的条件未成立,所以&&操作符不成立,从而导致echo无法输出“yes”,所以||操作符后面的“no”将被echo输出,所以第二个&&两边条件
都成立,故而pass会被echo输出】

if语句

if单分支语句

举例:

[root@localhost ~]# if [ 5 -gt 3 ]
> then
> echo "ok"
> fi
ok
[root@localhost ~]# if [ 3 -gt 2 ]; then echo "ok"; fi
ok
[root@localhost ~]# [ 4 -gt 6 ] && echo "ok"
ok
【单分支if语句中&&也实现简单的if语句判断】

if双分支语句

[root@localhost ~]# cat text.sh

#!/bin/bash

netstat -natp | grep ":80" &> /dev/null                   【检测80端口网络通信情况,并把数据丢入黑洞】

if [ $? -eq 0 ]                                           【执行$?等于0条件表达式】    
then                                                      【如果$?等于0条件成立则输出“httpd服务正在运行中”结果】
  echo "httpd服务正在运行中"

else                                                      【如果$?等于0条件不成立则输出“httpd服务未在运行,请启动该服务”结果】
  echo "htppd服务未在运行,请启动该服务"

fi
--------------------------------------------
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# ./text.sh 
httpd服务正在运行中
[root@localhost ~]# systemctl stop httpd
httpd服务未在运行,请启动该服务

if多分支语句、

[root@localhost ~]# cat text1.sh
#!/bin/bash
read -p "输入你的分数:" score            【使用read -p命令把键盘输入的值赋值给score变量】

if [ $score -ge 95 -a $score -le 100 ]
then
  echo "你的分数为:${score},真棒!"

elif [ $score -ge 80 ] && [ $score -lt 95 ];then
  echo "你的分数为:${score},请再接再厉!"

elif [[ $score -lt 70 && $score -ge 0 ]];then
  echo “你的分数为:${score} ,不及格!”

else
  echo "输入有误,请重新输入!"

fi
-------------------------------------------
[root@localhost ~]# chmod +x text1.sh 
[root@localhost ~]# ./text1.sh 
输入你的分数:69
“你的分数为:69 ,不及格!”
[root@localhost ~]# ./text1.sh 
输入你的分数:99
你的分数为:99,真棒!
[root@localhost ~]# ./text1.sh 
输入你的分数:0
“你的分数为:0 ,不及格!”
[root@localhost ~]# ./text1.sh 
输入你的分数:81
你的分数为:81,请再接再厉!
[root@localhost ~]# ./text1.sh 
输入你的分数:qwd
输入有误,请重新输入!

case分支语句

[root@localhost ~]# vim text1.sh

#!/bin/bash
read -p "输入你的分数:" score

[ $score -ge 85 -a $score -le 100 ] && a="great"
[ $score -ge 70 -a $score -le 84 ] && a="good"
[ $score -ge 0 -a $score -le 69 ] && a="false"

case $a in
great)
  echo "你的分数为:${score},真棒!"
;;

good)
  echo "你的分数为:${score},请再接再厉!"
;;

false)
  echo “你的分数为:${score} ,不及格!”
;;


*)
  echo "输入有误,请重新输入!"

esac
-----------------------------------
[root@localhost ~]# ./text1.sh 
输入你的分数:100
你的分数为:100,真棒!
[root@localhost ~]# ./text1.sh 
输入你的分数:70
你的分数为:70,请再接再厉!
[root@localhost ~]# ./text1.sh 
输入你的分数:0
“你的分数为:0 ,不及格!”
[root@localhost ~]# ./text1.sh 
输入你的分数:acd
“输入有误,请重新输入!”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值