shell条件测试(if,case)

shell条件测试

test命令

$? 返回码,可以用于判断最近一次的命令或者脚本是否执行成功

​ 状态:

​ 0 true 为真就是成立

​ 非0 flase 为假就是失败或者异常

​ test命令 可以进行条件测试,然后根据的是返回值来判断条件是否成立.

test -e 文件或者目录	#测试文件或者目录是否存在
echo $?			    # 返回结果

test -d 目录	  #测试目录是否存在

test -f 文件	  #测试文件是否存在

test -r 		#测试当前用户是否对文件或者目录有读权限

test -w			#测试是否有写权限

test -x			#测试是否有执行权限

比较符

-eq #等于 == #既可以比较整数,也可以比较字符串

-ne #不等于 != #表示不等于

-gt #大于 >

-lt #小于 <

-ge #大于等于 >=

-le #小于等于 <=

第二种形式

[ 3 > 5 ]

[3 -gt 5 ]

[ test == test1 ]

第三种形式

[[ ]] 可以使用更高级的模式,可以使用正则表达式,而且在双括号中,"变量"的""可以不加,原本加""是为了避免歧义,[[]]避免了歧义

第四种

(( )) 运算符

逻辑符号

&& 与,并且 条件都满足才成立 有些也可以用-a

|| 或者 有一个条件满足就成立 也可以用-o

[ $a -ne 1 ] && [ $a -ne 2 ]

[ $a -ne 1 -a $a -ne 2 ]

[ $a -ne 1 ] || [ $a -ne 2 ]

[ $a -ne 1 -o $a -ne 2 ]

双中括号只能用&&和||

[[ $a -gt 4 && $a -lt 6 ]]

[][][[ $a -gt 4 || $a -lt 6 ]]

if语句

​ 单分支结构:

​ vim if.sh

​ if [ 3 -gt 2 ] #条件测试语句

​ then #命令序列,只有条件测试语句成立,才会执行then里面的命令模块

​ echo "ok"

​ fi #结束语句

​ 双分支结构:

​ if [ 3 -gt 2 ]

​ then #条件满足执行then,不满足执行else

​ echo "ok"

​ else

​ echo "ok"

​ fi

​ 多分支结构:

​ if [ ]

​ then

​ 命令序列

​ elif [ ]

​ then

​ 命令序列

​ elif [ ]

​ then

​ 命令序列

​ else

​ 命令序列

​ fi

​ if嵌套

​ if [ ]

​ then

case语句

相当于多分支结构

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

试验

1.单分支

通过位置变量传参的方式,给脚本内部传一个ip地址

ping的通的要提示用户ip is online 而且要保存到/opt/hosts.txt文件

ping不通,提示用户 ip is offline

vim login1.sh
ping -c 3 $1
result=$? 
if [[ $result -gt 0 ]]
then
 echo "ip is offline"
else
 echo "ip is online"
 echo $1 >> /opt/hosts.txt
fi
:wq

bash login1.sh 192.168.118.10

2.双分支

随机输入一个整数,read -p输入一个整数

判断这个数是偶数还是技术,偶数提示偶数,奇数提示奇数

vim login2.sh
read -p "请输入一个数" num
 if [[ $(($num % 2)) -eq 0 ]]
  then
   echo "$num" "是个偶数"
 else
   echo "$num" "是个奇数"
 fi
:wq

bash login2.sh

3.嵌套多分支

​ 只有整数才可以进行进入到分数的区间

​ 请输入您的分数,0~100

​ 大于等于85,且小于等于100 优秀

​ 大于等于70,且小于等于84 一般

​ 如果大于等于60,且小于等于69 合格

​ 小于60 三十遍

​ 只有整数才可以进行进入到分数的区间

vim login3.sh
read -p "输入你的分数:" score
if [[ $score -eq $score ]] &> /dev/null
then
 if [[ $score -ge 85 && $score -le 100 ]]
 then
  echo "优秀"
 elif [[ $score -ge 70 && $score -le 84 ]]
 then
  echo "一般"
 elif [[ $score -ge 60 && $score -le 69 ]]
 then
  echo "合格"
 else
  echo "三十遍"
fi
else
 echo "夏季波协"
fi
:wq

bash login3.sh

4.case语句

read -p "输入一个成绩: " num
[[ $num -ge 80 && $num -le 100 ]] && a="great"
[[ $num -ge 70 && $num -le 79 ]] && a="standard"
[[ $num -ge 60 && $num -le 69 ]] && a="false"
case $a in
great) 
 echo "$num分,优秀"
;;
standard)
 echo "$num分,优秀"
;; 
false)
echo "$num分,优秀"
;;
*)
esac

练习题!

1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限

test -e $1
result=$?
if [[ $result -eq 0 ]]
then
 echo "文件存在"
 test -x $1
 result=$?
 if [[ $result -gt 0 ]]
 then
  echo "文件没有执行权限"
 else
  echo "文件有执行权限"
 fi
else
 echo "文件不存在"
fi

2.提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,

大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别。

男生进男生组,女生进女生组,如果输入错误请提示错误(整数判断,小数判断。9.72 3.21 )

read -p "100米所用的秒数:" sec
if [[ $sec -eq $sec ]]
then
 if [[ $sec -gt 0 && $sec -le 10 ]]
 then
  echo "进入选拔赛"
  read -p "请输入性别:" sex
  if [[ $sex == "男" ]]
  then
   echo "进入男子组"
  elif [[ $sex == "女" ]]
  then
   echo "进入女子组"
  else
   echo "???你性了个什么别?"
  fi
 else
  echo "淘汰"
 fi
else
 echo "请重新输入"
fi

3.用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录

read -p "请输入所传包的格式" input
[[ $input == .tar.gz ]] && moshi=".tar.gz"
[[ $input == .tar.bz2 ]] && moshi=".tar.bz2"
case $moshi in
.tar.gz)
 echo "即将解压到/opt/rh目录下"
 tar -zxvf $1 -C /opt

;;
.tar.bz2)
 echo "即将解压到/opt/rh目录下"
 tar -jxvf $1 -C /opt
;;
esac

4.提示用户输入内容,使用if 语句判断输入的内容是否为整数。判断范围0-100。

read -p "请输入一个数(0-100)" num
if [[ $num -eq $num ]] &> /dev/null
then
 if [[ $num -gt 0 && $num -lt 100 ]]
 then
  echo "整数在0-100之间"
 else
  echo "整数不在0-100之间"
 fi
else
 echo "不是个整数"
fi

5.根据上一题再判断输入的内容是奇数还是偶数。

read -p "请输入一个数(0-100)" num
if [[ $num -eq $num ]] &> /dev/null
then
 if [[ $num -gt 0 && $num -lt 100 ]]
 then
  echo "整数在0-100之间"
  if [[ $(( $num %2 )) -eq 0 ]]
  then
   echo "是个偶数"
  else
   echo "是个奇数"
  fi
 else
  echo "整数不在0-100之间"
 fi
else
 echo "不是个整数"
fi

6.用if 语句判断主机是否存活.保存到/opt/hosts.txt

ping -c 5 不显示ping的过程

read -p "请输入ip地址" ipinput
ping -c 5 $ipinput &> /dev/null
result=$?
if [[ $? -eq 0 ]]
then
 echo "能ping通,即将保存到/opt/hosts.txt"
 echo $ipinput >> /opt/hosts.txt
else
 echo "ping不通"
fi

7.用case语句控制 firewalld start|stop|restart|status 来管理firewalld服务,

要求如果命令选项不对,则提示输入不正确: {start|stop|status|restart}"。

echo "请选择对firewalld的管理项:\nstart|stop|restart|status: "
read -p " " input
#[[ $input -eq $input ]] && moshi=start
#[[ $input -eq $input ]] && moshi=stop
#[[ $input -eq $input ]] && moshi=restart
#[[ $input -eq $input ]] && moshi=status

case $input in
start)
echo "启动防火墙"
systemctl start firewalld
;;
stop)
echo "关闭防火墙"
systemctl stop firewalld
;;
restart)
echo "重启防火墙"
systemctl restart firewalld
;;
status)
echo "防火墙状态"
systemctl status firewalld
;;
*)
echo "输入不正确: {start|stop|status|restart}"
esac
相关推荐
shencz200012 分钟前
树莓派0 2W重启后突然没有声音
linux·树莓派
小猪佩奇QWQ26 分钟前
第1章 firewalld防火墙
linux·网络
不会倒的鸡蛋29 分钟前
Linux 操作系统详解
linux·ubuntu
月清晖1 小时前
centos更换yum源、安装Docker和换源
linux·docker·centos
【 教主 】2 小时前
<Linux> 多线程
linux·运维·服务器
技术探索者2 小时前
Shell:如何判断两个字符串相等
linux·shell
Slow2 小时前
Linux静态库的制作
linux·c语言
一个梦想过上五休二生活的男人2 小时前
Firewalld防火墙(二)
linux·服务器·数据库
一只猿Hou2 小时前
【logback-spring配置不生效,开发环境和生产环境配置不同输出级别】
linux·spring·logback
gopher95113 小时前
Linux多进程和多线程(五)进程间通信-消息队列
linux·服务器·c语言·开发语言·进程