第十九章、shell编程之条件语句

第十九章、shell编程之条件语句

1、条件测试

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

1.1 test命令

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

[root@xiaowang ~]# a=hello
[root@xiaowang ~]# echo $a
hello
[root@xiaowang ~]# test $a = hello
[root@xiaowang ~]# echo $?
0
[root@xiaowang ~]# test $a = Hello
[root@xiaowang ~]# echo $?
1
[root@xiaowang ~]# a=Hello
[root@xiaowang ~]# test $a = Hello
[root@xiaowang ~]# echo $?
0
[root@xiaowang ~]# a=hello
[root@xiaowang ~]# [ $a = hello ]   ###中括号左右两边有空格
[root@xiaowang ~]# echo $?
0
[root@xiaowang ~]# [ $a = Hello ]
[root@xiaowang ~]# echo $?
1
[root@xiaowang ~]#

2、文件测试

2.1 格式:[ 操作符 文件或目录 ]

2.2 常用操作符

操作符 说明
-e 测试目录或文件是否存在(Exist)
-d 测试是否为目录(Directory)
-f 测试是否为文件(File)
-r 测试当前用户是否有读取权限(Read)
-w 测试当前用户是否有写入权限(Write)
-x 测试是否设置有可执行权限(Excute)

2.3 示例

[root@xiaowang ~]# [ -f /etc/yum.repos.d/ ]
[root@xiaowang ~]# echo $?
1
[root@xiaowang ~]# [ -d /etc/yum.repos.d/ ]
[root@xiaowang ~]# echo $?
0

3、整数测试

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

3.2 常用操作符

操作符 说明
-eq 等于——==
-ne 不等于——!=
-gt 大于—— \ >
-lt 小于—— \ <
-le 小于等于——≤
-ge 大于等于——≥

3.3 示例

[root@xiaowang ~]# [ 3 -eq 4 ]
[root@xiaowang ~]# echo $?
1
[root@xiaowang ~]# [ 3 -ne 4 ]
[root@xiaowang ~]# echo $?
0

4、字符串测试

4.1 格式1

[ 字符串1 = 字符串2 ]或[ 字符串1 == 字符串2 ]
[ 字符串1 != 字符串

4.2 格式2

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

4.3 示例

[root@xiaowang ~]# [ abc = abc ]
[root@xiaowang ~]# echo $?
0
[root@xiaowang ~]# [ abc = ABC ]
[root@xiaowang ~]# echo $?
1
[root@xiaowang ~]# [ abc != ABC ]
[root@xiaowang ~]# echo $?
0
[root@xiaowang ~]# [ -n abc ]
[root@xiaowang ~]# echo $?
0
[root@xiaowang ~]# [ -z abc ]
[root@xiaowang ~]# echo $?
1

5、逻辑测试

5.1 格式1

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

5.2 格式2

命令1 操作符 命令2

5.3 常用操作符

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

5.4 示例

[root@xiaowang ~]# a=5
[root@xiaowang ~]# [ $a -ne 1 ] && [ $a != 3 ]
[root@xiaowang ~]# echo $?
0
[root@xiaowang ~]# [ $a -ne 1 -a $a != 3 ]
[root@xiaowang ~]# echo $?
0

[root@xiaowang ~]# a=5
[root@xiaowang ~]# [ $a -gt 20 ] && echo "$a<20" || echo "$a>=20"
5>=20      ###条件为假,执行或
[root@xiaowang ~]# [ $a -lt 20 ] && echo "$a<20" || echo "$a>=20"
5<20       ###条件为真,执行与

6、if单分支语句

6.1 格式

if条件测试操作
then
命令序列
fi

6.2 示例:编写一个shell脚本,输入一个整数,判断并输出它是奇数还是偶数。

[root@xiaowang ~]# cat 3.sh
#!/bin/bash
read -p "请输入一个整数: " num
A=$((num % 2))
if [ $A -eq 0 ];
then
    echo "这个数是偶数"
else
    echo "这个数是奇数"
fi
[root@xiaowang ~]# ./3.sh
请输入一个整数: 5
这个数是奇数
[root@xiaowang ~]# ./3.sh
请输入一个整数: 4
这个数是偶数

7、if双分支语句

7.1 格式

if 条件测试操作
then
命令序列 1
else
命令序列 2
fi

7.2 示例:请用户输入一个月份数字(范围1-12,1-6为上半年 7-12为下半年),shell脚本输出:判断用户输入的月份数字属于上半年还是下半年。

[root@xiaowang ~]# cat 11.sh
#!/bin/bash
read -p "请输入一个月份数字:" A
if [ $A -ge 1 -a $A -le 6 ];then
echo "这个月份属于上半年"
elif [ $A -ge 7 -a $A -le 12 ];then
echo "这个月份属于下半年"
else
echo "输入的月份不在有效范围内"
fi
[root@xiaowang ~]# ./11.sh
请输入一个月份数字:5
这个月份属于上半年
[root@xiaowang ~]# ./11.sh
请输入一个月份数字:11
这个月份属于下半年
[root@xiaowang ~]# ./11.sh
请输入一个月份数字:13
输入的月份不在有效范围内

8、if多分支语句

8.1 格式

if 条件测试操作 1
then
命令序列 1
elif 条件测试操作 2
then
命令序列 2
[else]
[命令序列 3]
fi

8.2 示例

[root@client ~]# cat score.sh
#!/bin/bash
read  -p "请输入您的分数(1~100)" score
if [ $score -ge 85 ]&&[ $score -le 100 ];then
   echo "$score分,优秀"
elif [ $score -ge 70 ]&&[ $score -le 84 ];then
   echo "$score分,合格"
else
   echo "$score分,不合格"
fi

[root@client ~]# bash score.sh
请输入您的分数(1~100)88
88分,优秀
[root@client ~]# bash score.sh
请输入您的分数(1~100)79
79分,合格
[root@client ~]# bash score.sh
请输入您的分数(1~100)66
66分,不合格

9、case分支语句

9.1 格式

case 变量值 in
模式 1)
命令序列 1
;;
模式 2)
命令序列 2
;;
……

*)
默认命令序列
esac

9.2 注意事项

① case 行尾必须为单词“in”,每一模式必须以右括号“)”结束。
② 双分号“;;”表示命令序列的结束。
③ 模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号“|”表示或,如“A|B”。
④ 最后的“)”表示默认模式,其中的**相当于通配符*。

9.3 示例

vim /etc/init.d/firewalld.sh
case $1 in
start)
	echo -n "正在启动 firewalld 服务 ... "
	systemctl start firewalld.service
	echo "OK"
;;

stop)
	echo -n "正在停止 firewalld 服务 ... "
	pkill "firewalld" &> /dev/null
	echo "OK"
;;

restart)
	$0 stop
	$0 start
;;

status)
	if pgrep "firewalld" &>/dev/null ; then 
	echo "firewalld 服务已经启动."
	else
	echo "firewalld 服务已经停止."
	fi
;;

* )
	echo "用法: $0 {start|stop|status|restart}"
esac

[root@xiaowang ~]# cat case.sh
#!/bin/bash

read -p "请输入一个年龄:" num
case $num in
5)
   echo "这是未成年人"
;;

20)
   echo "这是青年人"
;;

35)
   echo "这是中年人"
;;

70)
   echo "这是老年人"
;;

*)
   echo "这是个人"
;;
esac

[root@xiaowang ~]# sh case.sh
请输入一个年龄:5
这是未成年人
[root@xiaowang ~]# sh case.sh
请输入一个年龄:20
这是青年人
[root@xiaowang ~]# sh case.sh
请输入一个年龄:35
这是中年人
[root@xiaowang ~]# sh case.sh
请输入一个年龄:70
这是老年人
[root@xiaowang ~]# sh case.sh
请输入一个年龄:18
这是个人

你可能感兴趣的:(linux,服务器,运维)