Shell编程条件语句(if、case)

目录

一、Shell条件语句

 1.条件表达式测试

 2.文件测试

 3.整数值比较

 4.字符串比较

 5.逻辑测试

二、if 条件语句(串行执行)

(1)单分支结构

(2)双分支结构

(3)多分支结构

三、case语句(并行执行)


一、Shell条件语句

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

(与java等编程语言判断返回值完全相反!)

test 命令

更多操作可使用 man test 查看

 1.条件表达式测试

[ 条件表达式 ]

[root@localhost1 ~]#[ 1 = 1 ]
[root@localhost1 ~]#echo $?
0

[root@localhost1 ~]#[ 1 > 10 ]
[root@localhost1 ~]#echo $?
1

2.文件测试

[ 操作符 文件或目录 ]

文件操作符 含义
-e 查看文件或目录是否存在(exist)
-d 查看文件是否是一个目录(directory)
-f 查看文件是否是一个目录(file)
-r 查看文件或目录是否可读(read)
-w 查看文件或目录是否可写(write)
-x 查看文件或目录是否可执行(excute)
-L 查看文件或目录是否是软链接文件(link)
//测试 /root 是否是一个目录
[root@localhost1 ~]#test -d /root/
[root@localhost1 ~]#echo $?
0  --是

//测试 /root 是否是一个文件
[root@localhost1 ~]#[ -f /root/ ]
[root@localhost1 ~]#echo $?
1  --否

 3.整数值比较

[ 整数或变量 操作符 整数或变量 ]

数值操作符 含义
-eq 等于(equal)
-ne 不等于(not equal)
-lt 小于(less then)
-gt 大于(greater then)
-le 小于等于(less and equal)
-ge 大于等于(greater and equal)
[root@localhost1 ~]#a=10
[root@localhost1 ~]#b=20

//测试 $a 是否等于10
[root@localhost1 ~]#test $a -eq 10
[root@localhost1 ~]#echo $?
0
//测试 $a 是否大于 $b
[root@localhost1 ~]#test $a -gt $b
[root@localhost1 ~]#echo $?
1

4.字符串比较

[字符串1 操作符 字符串2]

字符串比较操作符 含义
= 等于
!= 不等于
-z 判断字符串是否为空
as[root@localhost1 ~]#echo $LANG
zh_CN.UTF-8

//判断 $LANG 是否为 us.en
[root@localhost1 ~]#[ $LANG = "us.en" ]
[root@localhost1 ~]#echo $?
1

5.逻辑测试

[ 表达式1 ] 操作符 [ 表达式2 ] 

逻辑操作符 含义
&& 且(逻辑与),两边表达式均为真才返回0,否则返回非0
-a 含义同上,使用方法为[ 表达式1 -a 表达式2 ] 
|| 或(逻辑或),两边表达式其一为真返回0,全否才返回非0
-o 含义同上,使用方法为[ 表达式1 -o 表达式2 ] 
取反(逻辑否),真否结果返回值相反
[root@localhost1 ~]#a=1
[root@localhost1 ~]#b=1

//逻辑与,两条命令均执行成功才返回0
[root@localhost1 ~]#[ $a = 1 ] || [ $a = $b ]
[root@localhost1 ~]#echo $?
0

//逻辑或,其一为真则返回0
[root@localhost1 ~]#[ $a > 1 ] || [ $a = $b ]
[root@localhost1 ~]#echo $?
0

特殊用法:&& 与 || 一起使用(逻辑与执行返回状态为否,则继续执行逻辑或后的命令)

//创建文件1.txt
[root@localhost1 data]#touch 1.txt
[root@localhost1 data]#ls
1.txt

//判断1.txt 是否是目录,逻辑与返回状态为否,继续执行逻辑或后的命令
[root@localhost1 data]#[ -d 1.txt ] && echo "1.txt 是目录" || echo "1.txt 不是目录"
1.txt 不是目录

二、if 条件语句(串行执行)

(1)单分支结构

if [ 条件表达式 ];than

   执行命令行 (当条件判断成立)

fi

//判断3是否大于2
[root@localhost1 ~]#vim test1.sh
#!/bin/bash
if [ 3 -ge 2 ]; then
  echo "yes"
fi

[root@localhost1 ~]#bash test1.sh
yes

(2)双分支结构

if [ 条件表达式 ];than

   执行命令行 (当条件判断成立)

else

   执行命令行 (当条件判断不成立)

fi

//判断年龄满足大于等于18的购买成人票,不满足购买学生票
[root@localhost1 ~]#vim test2.sh
#!/bin/bash
read -p "请输入您的年龄:" age
if [ $age -ge 18 ];then
  echo "请购买成人票(80元)"
else
  echo "请购买学生票(40元)"
fi

[root@localhost1 ~]#bash test2.sh
请输入您的年龄:20
请购买成人票(80元)

[root@localhost1 ~]#bash test2.sh
请输入您的年龄:8
请购买学生票(40元)

(3)多分支结构

if [ 条件表达式1 ];than

   执行命令行 (当条件判断1成立)

elif [ 条件表达式2 ];than                         -- 可以有多个elif 判断语句

   执行命令行 (当条件判断2成立)

else

   执行命令行 (当条件判断都不成立)

fi

[root@localhost1 ~]#vim test2.sh
#!/bin/bash
read -p "请输入您的年龄:" age
if [ $age -ge 60 ];then
  echo "请购买老人票(20元)"
elif [ $age -gt 18 ] && [ $age -lt 60 ];then
  echo "请购买成人票(80元)"
elif [ $age -ge 6 ] && [ $age -lt 18 ];then
  echo "请购买学生票(40元)"
else
  echo "请购买儿童票(20元)"
fi

[root@localhost1 ~]#bash test2.sh
请输入您的年龄:70
请购买老人票(20元)

[root@localhost1 ~]#bash test2.sh
请输入您的年龄:23
请购买成人票(80元)

[root@localhost1 ~]#bash test2.sh
请输入您的年龄:14
请购买学生票(40元)

[root@localhost1 ~]#bash test2.sh
请输入您的年龄:3
请购买儿童票(20元)

三、case语句(并行执行)

case 变量名 in

模式1)   -- 指定模式可以有多个(支持通配符)

  命令序列

  ;;

模式2)

  命令序列

  ;;

*)           -- 默认模式(除上述指定模式的其他情况)

  默认命令序列

  ;;

esac

[root@localhost1 ~]#vim test3.sh
#!/bin/bash
read -p "请输入你的分数(0~100):" num

case $num in
100)
  echo "满分!"
  ;;

9[0-9])
  echo "优秀!"
  ;;

[78][0-9])
  echo "良好!"
  ;;

6[0-9])
  echo "合格!"
  ;;

[0-9]|[1-5][0-9])
  echo "不及格!"
  ;;

*)
  echo "输入有误,请输入 0~100 的范围!"
esac

[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):100
满分!

[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):97
优秀!

[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):78
良好!

[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):62
合格!

[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):45
不及格!

[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):123
输入有误,请输入 0~100 的范围!

你可能感兴趣的:(Shell,linux,bash)