文章目录
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
 

 
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 语句结合
 
 










