shell脚本基础之条件语句详解

目录

一、条件语句

1、测试

1.1 测试判断

​1.2 比较整数数值

1.3 字符串比较

1.4 双中括号的用法

1.5 () 与 {} 的用法及区别

2、if语句 

2.1 单分支if语句

2.2 双分支if语句

2.3 多分支if语句

2.4 shell脚本的if语句案例

案例一

案例二

案例三

案例四

案例五

案例六

案例七

3、case语句

3.1 case语句格式

3.2 shell脚本的case语句案例

案例一

案例二

案例三

案例四

案例五


一、条件语句

条件语句用于根据给定条件执行不同的代码块

1、测试

1.1 测试判断

#测试判断
格式一: test  条件表达式
格式二: [条件表达式]

#文件测试
格式一: test   -操作符  条件表达式
格式二: [-操作符  目录或文件]
-操作符说明
-d测试是否为目录(Directory)
-e测试目录或文件是否存在(Exist)
-a测试目录或文件是否存在(Exist),有点小bug,不建议使用
-f测试是否为文件(File)
-r测试当前用户是否有权限读取(Read)
-w测试当前用户是否有权限写入(Write)
-x测试当前用户是否有权限执行(excute)
-L测试是否为软连接文件
-t fd文件描述符是否在某终端已经打开
-N FILE文件自从上一次被读取之后是否被修改过
-O FILE当前有效用户是否为文件属主
-G FILE当前有效用户是否为文件属组
-s FILE是否存在且非空

注:

判断该脚本是否有读取权限,是以实际效果为主而不是表面的显示,需要注意root权限

其他所有用户没有执行权限则root也没有执行权限,只要有一个用户有执行权限那么root用户也会拥有执行权限

注:

-e 选项和 -a 选项的区别:

-a选项在取反即使用 ! 有bug,所以不建议使用-a选项来检测文件或目录是否存在,建议用-e选项

1.2 比较整数数值

[ 整数1   -操作符   整数2 ] 
-操作符说明
-eq第一个整数等于(Equal)第二个整数
-ne第一个整数不等于(Not Equal)第二个整数
-gt

第一个整数大于(Greater Than)第二个整数

-lt第一个整数小于(lesser Than)第二个整数
-le第一个整数小于或等于(Lesser or Equal)第二个整数
-ge第一个整数大于或等于(Greater or Equal)第二个整数

1.3 字符串比较

[ 整数1   -操作符   整数2 ] 
测试操作符说明
=字符串内容相同
!=字符串内容不同,! 号表示相反的意思
-z字符串内容为空
-n字符是否存在
[ 字符串1 = 字符串2 ]       字符串1与字符串2是否相同

[ 字符串1 !=  字符串2 ]     字符串1与字符串2是否不相同

[ -z  字符串 ]              字符串是否为空

[ -n  字符串 ]              字符串是否存在

 1.4 逻辑测试(短路运算)

格式1: [ 表达式1 ]  操作符  [ 表达式2 ]  ... 
格式2: 命令1  操作符  命令2  ... 
操作符说明
-a 或 &&逻辑与,“而且”的意思全真才为真,一假即假
-o 或 ||逻辑或,“或者”的意思一真即为真,一真即真
!逻辑否
&&与||结合使用,一般只有以下一种用法

cmd1  &&  cmd2  ||  cmd3

该语句会有两种输出情况:
①cmd1的条件如果为真,就会执行cmd2的条件,那么整个式子一定为真,就不需要执行cmd3的条件
②cmd1的条件如果为假,就不需要执行cmd2的条件,因为这时(cmd1 && cmd2)整个为假,那么则需要执行cmd3的条件

案例一: 

使用ping命令检测主机网络联通性

#!/bin/bash
ping -c2 $1 &>/dev/null && echo "$1 is online" || echo "$1 is offline"
#使用ping命令检测主机的联通性,如果能ping通则返回"&1 is online",不能ping通则返回"$1 is offline"

 

亦可以用if语句实现

#!/bin/bash
ping -c2 -W2 172.16.12.10
if
        [ $? = 0 ]
then
        echo "该主机网络通顺"
        exit 1
fi
        echo "该主机网络不通"

案例二:

#!/bin/bash
use=`df|tr -s " "|grep sda|cut -d " " -f5|tr -d %`

[ $use -ge 80 ] && echo "磁盘使用量过高" | mail -s warning 3487547879@qq.com || echo "磁盘剩余量足够"
#当磁盘使用量超过80%时,会发送邮件到QQ邮箱警示你,当磁盘使用量小于80%,执行脚本会回复你“磁盘剩余量足够”

1.4 双中括号的用法

双中括号 [[ ... ]] 通常用于条件测试和比较操作。它们提供了更多的功能和灵活性,相较于单中括号 [ ... ]

特殊情况:

当使用 `==' 和 `!=' 操作符时,操作符右边的字符串被用作模式并且执行一个匹配,即支持通配符

当使用 `=~' 操作符时,操作符右边的字符串被当作正则表达式来进行匹配

[[ $file == *.log ]] =  [[ $file =~ log$ ]]

1.5 () 与 {} 的用法及区别

(CMD1 ; CMD2;... ;)和 { CMD1 ; CMD2 ; ... ; } 都可以将多个命令组合成一个整体,作为单个命令执行

区别说明
(CMD1 ; CMD2;... ;)开启子shell去执行命令,这也意味着括号内的变量更改不会影响到父shell
{ CMD1 ; CMD2 ; ... ; }使用当前shell去执行命令,可能会影响当前shell的环境

2、if语句 

2.1 单分支if语句

单分支if语句只包含一个条件,如果条件为真,则执行相应的代码块;否则跳过

#单分支if语句格式:
if  判断条件;
then 
条件为真的分支代码
fi

 2.2 双分支if语句

双分支if语句包含两个分支,一个是条件为真时执行的代码块,另一个是条件为假时执行的代码块

#双分支if语句格式:
if    判断条件; 
then
条件为真的分支代码

else
条件为假的分支代码

fi

 2.3 多分支if语句

多分支if语句使用elif关键字来测试多个条件,并在找到第一个为真的条件时执行相应的代码块

#多分支if语句格式:
if   判断条件1
then
条件1为真的分支代码

elif  判断条件2
then
条件2为真的分支代码

elif  判断条件3
then
条件3为真的分支代码

......
else
以上条件都为假的分支代码

fi

 2.4 shell脚本的if语句案例

案例一

编写脚本检查httpd服务是否开启,如果开启则反馈httpd服务正在运行,否则启动httpd服务

#!/bin/bash
#检查httpd服务是否开启,如果开启则反馈httpd服务正在运行,否则启动httpd服务
systemctl status httpd &> /dev/null
if [ $? -eq 0 ]
then
echo "httpd 服务正在运行"
else
systemctl start httpd
  if [ $? -eq 0 ]
  then
  echo "httpd 服务正常启动"
  else
  echo "httpd 服务异常,启动失败"
  fi
fi

案例二

编写脚本实现安装httpd服务,先判断操作系统的类型,如果是centos系统则使用yum命令安装httpd,如果是ubuntu系统则使用apt命令安装httpd,其他暂不支持

#!/bin/bash
#编写脚本实现安装httpd服务,先判断操作系统的类型,如果是centos系统则使用yum命令安装httpd,如果是ubuntu系统则使用apt命令安装httpd,其他暂不支持

if grep -q centos /etc/os-release
then
yum install httpd -y &>/dev/null
 if [ $? -eq 0 ]
 then
 echo "httpd服务安装成功!"
 else
 echo "httpd服务安装失败!请检查错误!"
 fi
elif grep -q ubuntu /etc/os-release
then
apt install httpd -y &>/dev/null
 if [ $? -eq 0 ]
 then
 echo "httpd服务安装成功!"
 else
 echo "httpd服务安装失败!请检查错误!"
 fi
else
echo "您的操作系统暂不支持安装httpd服务!"
fi

案例三

判断当前用户是否为超级管理员

#!/bin/bash
#判断当前用户是否为超级管理员
if [ "$USER" != "root" ]
then
        echo "非管理员用户无权限操作"
else
echo "您是管理员用户"
fi

案例四

请输入分数,来判断成绩的优良  

#!/bin/bash
#请输入分数,来判断成绩的优良  
#优秀:90~100分  良好:70~89分  60-69 及格:60~69分 不及格:0~59  分数输入错误可重新输入
read -p "请输入你的分数(0~100):" score
if [ $score -ge 90 -a $score -le 100 ];then
echo "优秀"
elif [ $score -ge 70 -a $score -le 89 ];then
echo "良好"
elif [ $score -ge 60 -a $score -le 69 ];then
echo "及格"
elif [ $score -ge 0 -a $score -le 59 ];then
echo "不及格"
else
echo "输入有误!请重新输入分数!"
bash $0
fi

案例五

编写脚本,根据当前时间打印不同的问候语

#!/bin/bash
#编写脚本,根据当前时间打印不同的问候语
h=`date +%H`
if [ $h -ge 6 -a $h -le 10 ];then
echo "早上好"
elif [ $h -ge 11 -a $h -le 13 ];then
echo "中午好"
elif [ $h -ge 14 -a $h -le 18 ];then
echo "下午好"
else
echo "晚上好"
fi

案例六

编写脚本实现石头剪刀布的游戏

#!/bin/bash

read -p "请输入 1(石头) 2(剪刀) 3(布):" h

m=`echo $[RANDOM%3+1]`

if [ $h -eq $m ]
then
echo "平局!"
elif [ $h -eq 1 -a $m -eq 2 -o $h -eq 2 -a $m -eq 3 -o $h -eq 3 -a $m -eq 1 ];then
echo "您赢了!"
else
echo "您输了!"
fi

 案例七

检测系统的用户状态是否正常,有用户也有家目录视为正常,有用户但是没家目录为无用户,其他没有用户则视为该用户不存在

#!/bin/bash

read -p "请输入用户名:" user
sh=`grep $user /etc/passwd | cut -d : -f6`
if grep $user /etc/passwd &>/dev/null
then
  if [ -e $sh ];then
  echo "该用户状态正常"
  else
    read -p "该用户没有家目录,是否删除该用户,请输入[yes/no]:" ask
      if [ $ask == yes ];then
          echo "正在删除用户……"
          userdel $user &>/dev/null
          echo "该用户已删除"
          elif [ $ask == no ];then
          exit
      fi
   fi
else
   echo "该用户不存在!" 
fi

3、case语句

3.1 case语句格式

case语句是一种条件语句,用于检查变量或数值等表达式的取值,并根据这些值执行相应的命令或代码块

case格式:

case  变量值  in
模式1)
分支1
 ;;
PAT2)
分支2
 ;;
......
*)       #支持通配符:*、?、[0-9]、|
默认分支
esac

 3.2 shell脚本的case语句案例

案例一

判断输入的是 yes(y,Y,Yes,yEs,yeS,YEs,YeS,yES,YES) 或者 no(N,n,no,No,nO,NO)

方法一: 

#!/bin/bash
#判断输入的是 yes(y,Y,Yes,yEs,yeS,YEs,YeS,yES,YES) 或者 no(N,n,no,No,nO,NO)

read -p "请输入 yes 或 no :" i
case $i in
[yY]|[yY][eE][sS])
echo "您输入的是:yes"
;;
[nN]|[nN][oO])
echo "您输入的是:no"
;;
*)
echo "您输入有误请重新输入 yes 或 no"
bash $0
esac

方法二: 

#!/bin/bash
#(y,Y,Yes,yEs,yeS,YEs,YeS,yES,YES) 或者 no(N,n,no,No,nO,NO)
read -p "请输入 yes 或 no :" i
num=`echo $i|tr 'A-Z' 'a-z'`

case $num in
y|yes)
echo "您输入的是:yes"
;;
n|no)
echo "您输入的是:no"
;;
*)
echo "您输入有误请重新输入 yes 或 no"
bash $0
esac

案例二

请输入分数,来判断成绩的优良  

#!/bin/bash
#请输入分数,来判断成绩的优良  
#优秀:90~100分  良好:70~89分  60-69 及格:60~69分 不及格:0~59  分数输入错误可重新输入
read -p "请输入你的分数(0~100):" score
case $score in
[99][0-9]|100)
echo "$score 成绩优秀"
;;          
[89][0-9])  
echo "$score 成绩良好"
;;         
[67][0-9])
echo "$score 成绩合格"
;;    
[0-9]|[1-5][0-9])
echo "$score 成绩不合格"
;;  
*)  
echo "输入有误!请重新输入分数!" 
esac

案例三

编写工具箱,即通过不同的选项可以查看不同的系统信息

#!/bin/bash

cat <<EOF
----------------------------------------
|1.查看系统类型
|2.查看主机名
|3.IP地址
|4.查看磁盘大小
|5.查看内存
|6.查看内核版本
|7.查看CPU型号
|8.退出工具箱
----------------------------------------
EOF

read -p "请输入(1~8)选项:" num

case $num in
1)
cat /etc/redhat-release
echo "------------------------------------"
echo
bash $0
;;

2)
hostname
echo "------------------------------------"
echo
bash $0
;;
3)
ifconfig ens33 | grep netmask | tr -s " " | cut -d " " -f3
echo "------------------------------------"
echo
bash $0
;;
4)
lsblk | grep disk | awk '{print $4}'
echo "------------------------------------"
echo
bash $0
;;
5)
free
echo "------------------------------------"
echo
bash $0
;;
6)
uname -r
echo "------------------------------------"
echo
bash $0
;;
7)
lscpu | grep 型号名称 | tr -s " " | cut -d" " -f2-8
echo "------------------------------------"
echo
bash $0
;;
8)
exit
echo "------------------------------------"
echo
bash $0
;;
esac

案例四

编写脚本实现石头剪刀布的游戏,需显示双方出的结果和输赢情况

#!/bin/bash
key=`echo $[RANDOM%3+1]`
read -p "请输入 1(石头) 2(剪刀) 3(布):" num

case $num in
1)
 num="石头"
;;
2)
 num="剪刀"
;;
3)
 num="布"
;;
*)
echo "您输入错误!请重新输入!"
 exit
;;
esac

case $key in
1)
 key="石头"
;;
2)
 key="剪刀"
;;
3)
 key="布"
;;
esac


if [ $num = "石头" -a $key = "剪刀"  -o $num = "剪刀" -a $key = "布" -o $num = "布" -a $key = "石头" ]
then
echo "机器出的是:$key"
echo "您出的是:$num" 
echo "您赢了!"

elif [ $num = $key ]
then
echo "机器出的是:$key"
echo "您出的是:$num" 
echo "平局!"

else
echo "机器出的是:$key"
echo "您出的是:$num" 
echo "您输了!"
fi

案例五

编写脚本实现点餐

#!/bin/bash
sum=0
PS3="请输入(1-6):"
MENU="
酸菜鱼
佛跳墙
东坡肉
鱼香肉丝
宫保鸡丁
点餐结束
"

select menu in $MENU
do
case $REPLY in
1)
echo "$menu 价格是:68"
let sum+=68
;;
2)
echo "$menu 价格是:50"
let sum+=50 
;;  
3)
echo "$menu 价格是:25"
let sum+=25
;;
4)
echo "$menu 价格是:22"
let sum+=22
;;
5)
echo "$menu 价格是:38"
let sum+=38
;;
6)
echo "点菜结束"
break
;;
*)
echo "点菜错误,请重新选择"
;;
esac
done
echo "总价是$sum"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/345888.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++day1作业

思维导图 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include <iomanip> using namespace std; int main() {string a;cout<<"输入一个字符…

vue3-深入组件-组件注册和props更多细节

组件注册 定义好的组件需要注册才能被使用。 注册方式有两种 全局注册 局部注册 全局注册 .component() 方法&#xff0c;让组件在当前 Vue 应用中全局可用。 在 main.ts 中 import ./assets/main.cssimport { createApp } from vue import { createPinia } from pinia i…

一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会名单

四川城市职业学院和陈老师在序号&#xff1a;158&#xff0c;300 一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会名单 各相关单位&#xff1a; 一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会于2023年11月12日正式成立。经各单位申请、大数据…

kafka-顺序消息实现

kafka-顺序消息实现 场景 在购物付款的时候&#xff0c;订单会有不同的订单状态&#xff0c;对应不同的状态事件&#xff0c;比如&#xff1a;待支付&#xff0c;支付成功&#xff0c;支付失败等等&#xff0c;我们会将这些消息推送给消息队列 &#xff0c;后续的服务会根据订…

数据的存储结构

1.类别 顺序存储、链式存储、散列存储、索引存储 2.顺序存储与链式存储的区别 顺序存储链式存储优点 可以实现随机存取每个元素占用最少的空间 充分利用所有存储单元&#xff0c;不会出现碎片现象。缺点 只能使用整块的存储单元&#xff0c;会产出较多的碎片。 需要额外的存…

12.for 条件循环语句 (3)

for 循环语句 允许脚本一次性读取多个信息&#xff0c;然后逐一对信息进行操作处理。当要处理的数据有范围时&#xff0c;使用for循环语句。 使用 for 循环语句从列表文件中读取多个用户名&#xff0c;然后为其逐一创建用户账户并设 置密码。首先创建用户名称的列表文件users.…

Linux浅学笔记02

目录 grep-wc-管道符 echo-tail-重定向符 vi编辑器 grep-wc-管道符 grep命令(过滤文件内容) //更准确的来说&#xff0c;是筛选包括“所需字符”的一句内容或多句内容。 语法&#xff1a;grep [-n] 关键字 文件路径 //-n&#xff1a;可选&#xff0c;表示在结果中匹配的行…

如何防止联通光猫后台运营商远程自动改超管密码

环境: 联通光猫 ZXHN F677V9 硬件版本号 V9.0 软件版本号 V9.0.0P1T3 U盘16G 笔记本电脑 问题描述: 如何防止联通光猫后台运营商远程自动改超管密码 家里用的是ZXHN F677V9 光猫,自己改了超级密码之后用了几次,最近就无法登录了,问了装维师傅说是最近统一改了,这还…

模型之大脑和计算机的模型化

大脑和计算机的模型化 “素数分解&#xff1a;悬而未决的问题与计算机科学的挑战” 计算机同样也可以看作由相互作用的各部分集合而成&#xff1b;很大程度上由于这个原因&#xff0c;理论计算机科学中同样有很多悬而未决的重要问题。其中有如下这样一个例子&#xff0c;我们…

2023 工业 AR 关键词:纵深和开拓

2023 年&#xff0c;以虚实融合、工业元宇宙为代表的“新数字化”升级在工业制造领域达成共识。 ▲五部委联合印发元宇宙行动计划 通过发展元宇宙赋能新型工业化 而相对过去几年的行业渗透广、落地场景多样的 AR 业务拓展与合作&#xff0c;#纵深和#开拓&#xff0c;成为 2023…

网工内推 | 国企、合资公司IT专员,13薪,NA以上即可

01 上海新徐汇&#xff08;集团&#xff09;有限公司 招聘岗位&#xff1a;IT运维 职责描述&#xff1a; 1.负责制定网络体系搭建、IP地址分配、网络拓扑图、无线网络等&#xff1b; 2.负责桌面运维技术支持&#xff0c;确保各类系统和终端设备正常工作&#xff1b; 3.负责弱电…

构建中国人自己的私人GPT—与文档对话

先看效果 他可以从上传的文件中提取内容作为答案。上传文件摄取速度 摄取速度取决于您正在摄取的文档数量以及每个文档的大小。为了加快摄取速度&#xff0c;您可以在配置中更改摄取模式。 存在以下摄取模式&#xff1a; simple&#xff1a;历史行为&#xff0c;一次按顺序摄…

Bread:一款功能强大的BIOS逆向工程和高级调试工具

关于Bread Bread是一款功能强大的BIOS逆向工程和高级调试工具&#xff0c;该工具也是一个“可注入”的实模式&#xff08;Real-Mode&#xff09;x86调试器&#xff0c;可以帮助广大研究人员通过串行线缆从另一台电脑调试任意实模式代码。 考虑到目前社区中很多BIOS逆向工程工…

学编曲怎么入门 学会编曲能赚钱吗 编曲软件哪个好用 学编曲要先学什么 编曲和作曲什么区别

一、学编曲有什么用 1、工作时间较为自由 编曲是一个技能专业&#xff0c;换句话说&#xff0c;编曲是一项技能&#xff0c;如果能够熟练掌握编曲这项技能&#xff0c;那么就可以尝试从事一些和编曲相关的职业&#xff0c;例如编曲师等等&#xff0c;这类和编曲有关的职业大多…

零基础学Python(5)— 基本数据类型

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在内存中存储的数据可以有多种类型。例如&#xff1a;一个人的姓名可以用字符型存储&#xff0c;年龄可以使用数值型存储&#xff0c;婚姻状况可以使用布尔型存储。这里的字符型、数值型、布尔型都是Python语言中提供的基本…

gin介绍及helloworld

1. 介绍 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有快速灵活&#xff0c;容错方便等特点 对于golang而言&#xff0c;web框架的依赖要远比Python&#xff0c;Java之类的要小。自身的net/http足够简单&…

RK3399平台开发系列讲解(USB篇)BusHound 工具使用介绍

🚀返回专栏总目录 文章目录 一、BusHound简介二、BusHound的下载三、BusHound设备窗口四、BUSHound发送命令窗口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 BusHound软件是由美国perisoft公司研制的一种专用于PC机各种总线数据包监视和控制的开发工具软件,其名…

帝国cms无限级分销的逻辑思路效果展示以及表结构的初步规划

#小李子9479# #帝国cms无限级分销# #帝国cms三级分销系统# 关于分销系统 &#xff0c;我们要解决以下几个重要的逻辑关系&#xff0c; 1&#xff0c;用户上下级关系&#xff0c;即A通过分享期邀请链接&#xff0c;B点击或扫码注册后&#xff0c;成为A的下线。 2。下级级别的…

10.常用统计分析方法——主成分分析和因子分析

基础知识&#xff1a; 主成分分析概念 主成分分析PCA&#xff1a;是一种数据降维的技巧&#xff0c;将大量相关变量转化为一组很少的不相关变量&#xff0c;这些无关变量称为主成分。 在特征选择方法中有一种方法是方差过滤&#xff0c;即如果一个特征的方差很小&#xff0c…

ckman:非常好用的ClickHouse可视化集群运维工具

概述 什么是ckman ckman&#xff0c;全称是ClickHouse Management Console&#xff0c; 即ClickHouse管理平台。它是由擎创科技数据库团队主导研发的一款用来管理和监控ClickHouse集群的可视化运维工具。目前该工具已在github上开源&#xff0c;开源地址为&#xff1a;github…
最新文章