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
相关推荐
即将头秃的程序媛2 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
fangeqin2 小时前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
爱奥尼欧3 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
超喜欢下雨天4 小时前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
tan77º5 小时前
【Linux网络编程】网络基础
linux·服务器·网络
笑衬人心。5 小时前
Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南
linux·mysql·ubuntu
chanalbert7 小时前
CentOS系统新手指导手册
linux·运维·centos
星宸追风7 小时前
Ubuntu更换Home目录所在硬盘的过程
linux·运维·ubuntu
热爱生活的猴子8 小时前
Poetry 在 Linux 和 Windows 系统中的安装步骤
linux·运维·windows
myloveasuka8 小时前
[Linux]内核如何对信号进行捕捉
linux·运维·服务器