文章目录
1 条件测试
1.1 test 命令
测试特定的表达式是否成立,当条件成立,测试语句的返回值为0,否则为其他数值
格式1 :test [操作符选项] 条件表达式
格式2 :[操作符选项 条件表达式]
#条件表达式的两边都需要有空格,否则会失败,且此方法更为常用
常见的测试操作符 | 含义 |
---|---|
-d | 测试是否为目录(Directory),指定的目录是否存在 |
-e | 测试目录或文件是否存在(Exist) |
-f | 测试是否为文件(File),指定的文件是否存在 |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户是否有执行权限(excute) |
-L | 测试文件是否为符号链接(软链接文件) |
-nt | 判断文件A是否比文件B新 |
-ot | 判断文件A是否比文件B旧 |
-ef | 判断两个文件是否为同一文件 |
案例一:测试是否为目录
案例二
1.2 比较整数数值
格式: [整数变量1 操作符 整数变量2 ]
常用操作符 | 说明 |
---|---|
-eq | 等于(Equal)== |
-ne | 不等于(Not Equal)!= |
-lt | 小于(Leser Than)< |
-gt | 大于(Greater Than)> |
-le | 小于或等于(Lesser or Equal)<= |
-ge | 大于或等于(Greater or Equal)>= |
不建议使用==、!=、<、>、<=、>=,会出问题
案例一
案例二:查询用户数量是否大于1,如果大于,则进行提示
案例三
1.3 字符串比较
格式1:
[ "字符串1" = "字符串2" ] 或者 [ "字符串1 == 字符串2" ] //判断是否相等
[ "字符串1" != "字符串2" ] //判断是否不等
格式2:
[ -z "字符串" ] //-z:判断字符串内容是否为空或者指定的变量是否为空值
[ -n "字符串" ] //-n:检查是否有字符串存在
注意:字符串要加""(冒号),不然会出问题
操作符 | 含义 |
---|---|
= | 字符串内容相同 |
!= | 字符串内容不同,!号表示相反的意思 |
-z | 字符串内容为空 |
-n | 检查是否有字符串存在 |
浮点数的运算
echo "浮点运算字符串" | bc
awk 'BEGIN{print 浮点运算字符串}'
1.4 逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:命令1 操作符 命令2
-a或&& | 逻辑与,而且的意思 |
---|---|
-o或▕▕ | 逻辑或,或者的意思 |
! | 逻辑否 |
&&:前面命令都执行成功后, 才执行最终结果
II:前面命令有一个为真,就可以执行最终结果
三元运算符
#java,c中
条件表达式?a:b:当条件表达式为真时,取a值;当条件表达式为假时,取b值
#shell中
[ 表达式 ] && a ll b:当条件表达式为真时,取a值;当条件表达式为假时,取b值
案例一
[root@localhost home]# [ -d /etc ] && [ -r /home ] && echo "you can open it"
[root@localhost home]# [ -d /etc ] || [ -L /home ] && echo "ok"
案例二
[root@localhost home]# [ 4 -lt 5 ] && echo true || echo false //成立输出true,不成立输出false
[root@localhost home]# [ 4 -gt 5 ] && echo true || echo false
2 if 语句
2.1 单分支
只要满足“相对应的条件”,便可执行后面的命令
if [ 条件判断 ] //当条件判断成立时,执行一条或多条命令
then
命令
fi
或者[ 表达式 ] && a
案例一
#!/bin/bash
if [ 3 -gt 2 ]
then
echo "3大于2"
fi
案例二:查看 MOUNT 有没有这个目录,没有就创建一个
2.2 双分支
针对"条件成立" "条件不成立"两种情况,分别执行相应的代码
在同一个数据的判断中,如果该数据需要进行两种不同的判断,我们就需要双分支if语句
if [ 条件判断式 ]; then
当条件判断成立时,可以执行一条或多条命令
else
当条件判断不成立时,可以执行一条或多条命令
fi
案例一:判断你是否系统重启
[root@localhost data]# vim reboot.sh
#!/bin/bash
read -p "请输入yes确定重启:" test
if [ $tset = "yes" ]
then
echo "系统重启"
else
else "没有输入yes,系统将不重启"
fi
案例二:判断 ping 命令检测主机结果
方法一
[root@localhost data]# vim ping.sh
#!/bin/bash
ping -c3 -i 0.2 -W1 192.168.16.16 &>/dev/null
if [ $? -eq 0 ];then
echo "host 101 is online"
else
echo "host 101 is down"
fi
方法二
#!/bin/bash
#用if语句判断主机是否存活
read -p "请输入主机IP:" i
ping -c3 -i 0.2 -W1 $i &> /dev/null
#-C:只发送三个测试包 -i:间隔0.2秒 -W:超时1秒(W要大写)
if [ $? -eq 0 ];then
echo "主机存活"
else
echo "主机不存活"
#判断ping命令的检测结果,分别给出不同提示
fi
案例三:判断当前用户是否是 root
案例四:磁盘空间
[root@localhost data]# vim for13.sh
#!/bin/bash
USED=$(df | grep /dev/sda1 | awk '{print $5}' | awk -F '%' '{print $1}')
if [ $USED -gt 5 ];then
echo "警告!当前 / 目录的磁盘使用率为 ${USED}%"
fi
2.3 多分支
嵌套使用,进行多次判断
if [ 条件判断式 ]; then
当条件判断成立时,可以执行一条或多条命令
elif [ 条件判断式二 ]; then
当条件判断成立时,可以执行一条或多条命令
else
当上面的条件判断都不成立时,可以执行一条或多条命令
fi
案例一:判断分数范围,分出优秀、合格、不合格三种
#!/bin/bash
read -p "请输入你的分数(0-100):" num
if [ $num -ge 90 -a $num -le 100 ];then
echo "优秀"
elif [ $num -ge 70 -a $num -le 89 ];then
echo "良好"
elif [ $num -ge 60 -a $num -le 69 ];then
echo "合格"
elif [ $num -ge 0 -a $num -le 59 ];then
echo "不合格"
else
echo "输入有误,请重新输入0-100的正整数"
fi
[root@localhost data]# vim case1.sh
#!/bin/bash
read -p "请输入你的分数:(0-100)" num
[ $num -eq 100 ] && a="A"
[[ $num -ge 80 && $num -le 99 ]] && a="B"
[[ $num -ge 60 && $num -le 79 ]] && a="C"
[[ $num -ge 0 && $num -le 59 ]] && a="D"
case $a in
A)
echo "恭喜你!获得$num分"
;;
B)
echo "秀儿!获得$num分"
;;
C)
echo "继续努力!获得$num分"
;;
D)
echo "请卷起来!获得$num分"
;;
esac
案例二:判断现在的时间是上午、下午、晚上还是其他时间,并输出早上好、中午好、晚上好还是休息时间
[root@localhost ~]# vim time.sh
#!/bin/bash
Time=$(date +%H)
if [ $Time -ge 6 -a $Time -le 10 ]
then
echo "早上好"
elif [ $Time -ge 11 ] && [ $Time -le 13 ]
then
echo "中午好"
elif [ $Time -ge 14 ] && [ $Time -le 18 ]
then
echo "下午好"
elif [ $Time -ge 19 ] && [ $Time -le 23 ]
then
echo "晚上好"
else
echo "休息时间"
fi
2.4 if 的综合案例
案例一:检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限
#!/bin/bash
if [ -f $HOME/test.sh ];then
#-f 是否为文件(File),指定的文件是否存在
#-x 测试当前用户是否有执行权限
echo "文件存在"
if [ -x ~/test.sh ];then
echo "文件有权限"
else
echo "文件没有执行权限"
fi
else
echo "文件不存在"
fi
案例二:提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误
#!/bin/bash
read -p "请输入100米赛跑的秒数(0-100):" second
if [ $second -gt 0 ] && [ $second -le 10 ];then
echo "恭喜你,进入选拔赛,成绩为:" $second秒
read -p "请输入你得性别(男/女):" sex
if [ $sex = '男' ];then
echo "你进入男生组!"
elif [ $sex = '女' ];then
echo "你进入女生组!"
else
echo "输入有误,请重新输入(男/女)"
fi
elif [ $second -gt 10 ] && [ $second -le 100 ];then
echo "很遗憾,你被淘汰了,成绩为:" $second秒
else
echo "输入有误,请重新输入(0-100)"
bash $0
fi
3 case语句
case 行首必须以单词 “in”,每一模式必须以单个右括号 “)” 结束
双分号 “;;” 表示命令序列的结束
模式字符串中,可以用方括号表示一个连续的范围,如 “[0-9]”;还可以使用竖杠 | 表示或,比如 a|b
最后的)表示默认模式,其中的相当于通配符
格式:
case 变量名称 in
模式1)
命令序列
;;
模式2)
程序段
;;
*) //不包含第一个变量内容与第二个变量内容的其他程序执行段
默认程序段
;;
esac
模式:可以是具体的数值,也可以是范围
如果是范围支持通配符
* | 任意字符任意条件 |
---|---|
? | 任意单个字符 |
[0-9] | 单个数字 |
▕ | 或者 |
当变量值有多个数值的情况,可以使用case模式中的数字只能写[0-9],
例:1[0-9]:表示10-19
案例一:输入一个分数,判断是优秀,良好,及格,不及格
[root@localhost ~]# vim case.sh
#!/bin/bash
read -p "请输入你的分数(0-100):" score
case $score in
100)
echo "优秀"
;;
[8-9][0-9])
echo "良好"
;;
[6-7][0-9])
echo "及格"
;;
[0-9]|[1-5][0-9])
echo "不及格"
;;
*)
echo "输入有误,请输入0-100"
bash $0
esac
案例二:输入你想连接的服务器,判断是否通
[root@localhost ~]# vim case1.sh
#!/bin/bash
web1="192.168.16.16"
mysql="192.168.16.17"
docker="192.168.16.18"
cat <<EOF
1 web1
2 mysql
3 docker
EOF
read -p "请输入你想连接的服务器(1-3):" host
case $host in
1)
ssh $web1
;;
2)
ssh $mysql
;;
3)
ssh $docker
;;
*)
echo "输入有误,请重新输入1-3"
bash $0
;;
esac
案例三:输入一个月份,判断在一年那个季度
[root@localhost ~]# vim case2.sh
#!/bin/bash
read -p "请输入月份:" yue
case $yue in
[1-3])
echo "第一季度";;
[4-6])
echo "第二季度";;
[7-9])
echo "第三季度";;
1[0-2])
echo "第四季度";;
*)
echo "输入错误"
esac
案例四:输入 yes/no
[root@localhost ~]# vim case3.sh
#!/bin/bash
read -p "请输入yes/no:" key
case $key in
[nN]|[nN][oO])
echo "你输入的是no"
;;
[Yy]|[Yy][eE][Ss])
echo "你输入的是yes"
;;
*)
echo "你输入错误,不是yes/no"
esac
案例五:输入一个字符,判断是数字、字母还是其他字符
[root@localhost ~]# vim case4.sh
#!/bin/bash
#匹配 数字 字母 其他字符
read -p "请输入一个字符:" key
case $key in
[0-9])
echo "你输入的是数字"
;;
[a-z][A-Z])
echo "你输入的是字母"
;;
*)
echo "你输入的是其他字符"
esac
4 总结
1、测试
测试分为文件测试、字符测试、数字测试
格式1 :test 条件表达式
格式2 :[条件表达式]
常见的测试操作符 | 含义 |
---|---|
-d | 测试是否为目录(Directory) |
-e | 测试目录或文件是否存在(Exist) |
-f | 测试是否为文件(File) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户是否有权限执行(excute) |
2、if 语句
单分支
if [ 条件判断 ] //当条件判断成立时,执行一条或多条命令
then
命令
fi
双分支
if [ 条件判断式 ]; then
当条件判断成立时,可以执行一条或多条命令
else
当条件判断不成立时,可以执行一条或多条命令
fi
多分支
if [ 条件判断式 ]; then
当条件判断成立时,可以执行一条或多条命令
elif [ 条件判断式二 ]; then
当条件判断成立时,可以执行一条或多条命令
else
当上面的条件判断都不成立时,可以执行一条或多条命令
fi
3、case 语句
格式:
case 变量名称 in
模式1)
命令序列
;;
模式2)
程序段
;;
*) //不包含第一个变量内容与第二个变量内容的其他程序执行段
默认程序段
;;
esac
5 Shell 脚本小游戏:石头剪刀布
方法一:用 if 语句
[root@localhost data]# vim if1.sh
#!/bin/bash
key=$[RANDOM%3+1]
#1:包子 2:剪刀 3:锤子
read -p "请输入1包子,2剪刀,3锤子:" num
if [ $num -eq $key ]
then
echo "打成平局"
elif [ $num -eq 1 ] && [ $key -eq 2 ]
then
echo "机器胜利"
#人类是num,机器是key
elif [ $num -eq 1 ] && [ $key -eq 3 ]
then
echo "人类胜利"
elif [ $num -eq 2 ] && [ $key -eq 1 ]
then
echo "人类胜利"
elif [ $num -eq 2 ] && [ $key -eq 3 ]
then
echo "机器胜利"
elif [ $num -eq 3 ] && [ $key -eq 1 ]
then
echo "机器胜利"
elif [ $num -eq 3 ] && [ $key -eq 2 ]
then
echo "人类胜利"
else
echo "请按要求输入1-3"
fi
方法二:if 和 case 语句结合