目录
一、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 的范围!