Shell编程--流程控制
目录
- 1.条件结构
- 1.1.文件测试(字符串)
- 1.2.字符串比较
- 1.3.数字条件比较
- 1.4.文件条件判断
- 2.if多条件判断
- 3.case语句
1.条件结构
测试:test 条件
条件为真返回 0,条件为假返回 1
语法:[ 条件 ]
test 条件能够理解以下类型的表达式
1.1.文件测试(字符串)
-n STRING
the length of STRING is nonzero
-n 字符串的长度 【不是】零成功。
-n不为空案例:
[root@localhost ~]# vim a.sh
#!/usr/bin/bash
read -p "请输入幸运数字" lucky_num
if [[ -n $lucky_num ]]; thenecho "您的幸运数字是$lucky_num"
elseecho "您输入的幸运数字为空"exit
fi
//执行:
[root@localhost ~]# bash a.sh
请输入幸运数字12
您的幸运数字是12
[root@localhost ~]# bash a.sh
请输入幸运数字
您输入的幸运数字为空
-z STRING
the length of STRING is zero
-z 字符串长度【是】零成功
对于未定义或赋予空值的变量将是为空串。
-z为空案例,为空时则执行
[root@localhost ~]# cat b.sh
#!/usr/bin/bash
read -p "请输入幸运数字" lucky_num
if [[ -z $lucky_num ]]; thenecho "您输入的幸运数字为空"
elseecho "您输入的幸运数字为$lucky_num"exit
fi
//执行:
[root@localhost ~]# bash b.sh
请输入幸运数字 #不输入,留空
您输入的幸运数字为空
[root@localhost ~]# bash b.sh
请输入幸运数字23 #输入数字
您输入的幸运数字为23[root@localhost ~]# vim string.sh
#!/bin/bash
while :
doread -p "请输入你的密码:" passpasswd=12345if [[ -z $pass ]];thenecho "您输入的密码不能为空"exit 1elseif [[ $pass == $passwd ]];thenecho "密码输入成功"breakelseecho "您输入的密码有误,请重新输入" fifi
done
1.2.字符串比较
STRING1 = STRING2 (等于)
the strings are equal
STRING1 != STRING2 (不等于)
the strings are not equal
1.3.数字条件比较
格式 | 含义 |
---|---|
-eq(equal) | 等于 |
-ne(not equal) | 不等于 |
-ge(Greater than or equal to) | 大于等于 |
-le(Less than or equal to) | 小于等于 |
-gt(greater than) | 大于 |
-lt(less than) | 小于 |
1.4.文件条件判断
格式 | 含义 |
---|---|
-f | 存在且是正规文件 |
-d | 存在且是目录 |
-h | 存在且是符号链接 |
-b | 块设备 |
-c | 字符设备 |
-e | 文件存在 |
[root@localhost ~]# vim file.sh
#!/bin/bash
file=/root/test.txt
if [[ -e $file ]];thenecho "$file"
elseecho "文件不存在" touch $file && echo "文件已创建"
fi
2.if多条件判断
流程控制:在一个shell脚本中的【命令执行的顺序】称作脚本的流。大多数脚本会根据一个或多个条件来改变它们的流。
流控制命令:能让脚本的流 根据条件而改变的命令,称为条件流控制命令
exit语句:退出程序的执行,并返回一个返回码,返回码为0正常退出,非0为非正常退出,例如: exit 0
条件判断语法:if 代码返回0表示真,非0为假
if语句语法如下:
if [[ -e -eq -ne ]];then //-e -eq -ne是你的测试条件,你要测试什么,对什么内容做判断(例如$? -eq 0)list1 //执行list2里面的内容
elif [[ -e -eq ]];then //接着在怎么做。(多条件判断)list2
else //如果前面的命令没有执行成功那就执行else下面的命令。list3
fi
[root@localhost ~]# cd /opt/test/script/
[root@localhost script]# vim testif.sh
#!/bin/bash
read -p "请输入号码: " num
if [[ $num = 1 ]];thenecho "1"
elif [[ $num = 2 ]];thenecho "2"
elif [[ $num = 3 ]];thenecho "3"
else echo "输入有误!"
fi
[root@localhost script]# bash testif.sh
例:脚本if.sh,必须在脚本后加上适当的参数脚本才能正确执行
[root@localhost script]# vim if.sh
#!/bin/bash
if [[ "$1" = "hello" ]]; thenecho "Hello! How are you ?"
elif [[ "$1" = "" ]]; thenecho "You MUST input parameters"
elseecho "The only accept parameter is hello"
fi
[root@localhost script]# chmod +x if.sh
//测试:
[root@localhost script]# ./if.sh
[root@localhost script]# ./if.sh hello
[root@localhost script]# ./if.sh 434
练习:
(1)检测nginx是否已经安装、已经运行,如果没有安装和运行则【安装并启动】,并【记录启动】的时间,保存到日志中。
#!/bin/sh
#check_nginx_install
nginx -V
if [[ $? -ne 0 ]]; thenyum -y install nginx
fi
#check_nginx_status
ps -ef|grep nginx && netstat -ntlp|grep nginx
if [[ $? -ne 0 ]]; thensystemctl restart nginx
fi
#record_nginx_up_time
up_time=$(systemctl status nginx.service |grep -i active|awk '{print $6,$7}')
echo $up_time > /root/nginx_up_time
(2)测试ip地址主机位从2到100的机器是否存活,并把存活的机器记录到文本文件alivehost.txt内。(使用ping命令)
#!/usr/bin/bash
ip=192.168.17
for i in {2..100}
doping -c1 -w1 $ip.$i &> /dev/nullif [ $? -eq 0 ];thenecho "$ip.$i is up" >> activehost.txtelseecho "$ip.$i is down" &> /dev/nullfi
done
多个条件联合:
&&:逻辑与,前面执行成功,后面才执行。前面命令执行失败,后面命令也不执行
if [ $condition1 ] && [ $condition2 ];then
if [[ $condition1 && $condition2 ]];then
||:逻辑或,前面执行失败,后面执行,前面命令执行成功,后面不执行。
if [ $condition1 ] || [ $condition2 ];then
if [[ $condition1 || $condition2 ]];then
拓展知识:[[ ]]和[ ]的区别
[[ ]]支持正则表达式,而[ ]不支持
例如:
[[ $a == z* ]] # 正则匹配
[ $a == z* ] # 无效
[ ] 语法 都可以由 [[ ]] 替代,并且后者功能更丰富
[ ] 使用 -a、-o 分别表示与、或 关系 ,[[ ]]使用 &&、 ||表示与 、或关系
而且在使用中,[[ ]]比[ ]更加的稳定,在脚本的使用中,建议使用[[ ]]
1. 判断一个用户是否存在
2. 判断当前内核主版本是否为3,且次版本是否大于10//主版本获取:uname -r|cut -d. -f1 #-d. 以什么为分隔符 -f1打印第一段3//次版本获取uname -r|cut -d. -f210//或者:[root@localhost ~]# uname -r|awk -F'.' '{print $1}'3[root@localhost ~]# uname -r|awk -F'.' '{print $2}'10
3. 判断vsftpd软件包是否安装,如果没有则自动安装 (yum是否能用,不能用自动修复,安装完成测试下,是否能用。)
4. 判断httpd是否运行
5. 判断指定的主机是否能ping通,必须使用$1变量
ping -c1 -w1 $1.com
3.case语句
case 语句是 shell 中流控制的第二种方式,语法如下:
case $变量 inpattern1)list1;; //2个英文的分号结尾。pattern2)list2;;... ...patternN)listN;;*) //如果前面命令没有执行成功那么执行下面这个list*;;
esac //结尾
第一行:声明case关键字调用case语法,紧跟的“变量”一般为用户的输入值, in代表从下方的各个模式进行匹配
第2-4行:匹配到“pattern1”后进行命令的输出或执行, pattern1: 一般为字符或数值
第11-12行:当用户输入的字符不存在匹配模式时, 直接执行或打印)下的命令或语句*
[root@localhost script]# vim case1.sh
#!/usr/bin/env bash
case $1 ina)echo "one";;b)echo "two";;*)echo "Usage:$0 '{a|b}'" # $0就是这个脚本;;
esac
//执行结果
[root@localhost ~]# bash case.sh
Usage:case.sh '{a|b}'
[root@localhost ~]# bash case.sh a
one
[root@localhost ~]# bash case.sh b
two
练习:
建立脚本case2.sh,当执行时,要求我们在键盘输入适当的值(数字),当输入正确时并打印,当输入错误时会提示你,应该输入正确的值。
[root@localhost script]# vim case3.sh
#!/usr/bin/env bash
read -p "请输入:" get
case $get in
[0-9][0-9])echo -e "你输入的是数字,为:$get\n";;
*)echo -e "你输入的不是数字。\n";;
esac
示例:编写系统工具脚本
[root@localhost script]# vim system_tools.sh
#!/usr/bin/env bash
#cat <<-EOF
echo '
+-------------------------------------------------------------------------+
| System_tools V1.0 |
+-------------------------------------------------------------------------+
| a. Stop And Disabled Firewalld. |
| b. Disabled SELinux Secure System. |
| c. Install Apache Service. |
| d. Quit |
+-------------------------------------------------------------------------+
'
#EOF
read -t 60 -p "请在1分钟内作出选择" choose
case "$choose" in"a")systemctl stop firewalld && systemctl disable firewalld;;"b")setenforce 0;;"c")yum -y install httpd httpd-tools;;"d")exit;;*)printf "请按照上方提供的选项输入!!!\n";;
esac
[root@localhost script]# chmod +x system_tools.sh
[root@localhost script]# ./system_tools.sh
练习:
建立脚本service.sh,当用户执行的时候要求输入(1、2、3、4、5)时安装对应的httpd、vim、wget、更换aliyun yum源等功能,当输入错误时会提示你,应该输入正确的值。
[root@localhost ~]# vim service.sh
#!/bin/bash
echo '
+-------------------------------------------------------------------------+
| System_tools V1.0 |
+-------------------------------------------------------------------------+
| 1. Install Apache Service. |
| 2. Install Vim. |
| 3. Install Wget. |
| 4. Change Aliyun Yum. |
| 5. Change Tencent Yum. |
| 6. Quit |
+-------------------------------------------------------------------------+
'
read -t 60 -p "请在1分钟内作出选择" choose
case "$choose" in"1")yum -y install httpd httpd-tools;;"2")yum -y install vim;;"3")yum -y install wget;;"4")yum -y install wgetmv /etc/yum.repos.d/* /tmpwget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repowget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum makecacheyum repolist;;"5")yum -y install wgetmv /etc/yum.repos.d/* /tmpwget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repowget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repoyum makecacheyum repolist;;"6")exit;;*)echo -e "请按照上方提供的选项输入!!!\n";;
esac[root@localhost ~]# bash service.sh
+-------------------------------------------------------------------------+
| System_tools V1.0 |
+-------------------------------------------------------------------------+
| 1. Install Apache Service. |
| 2. Install Vim. |
| 3. Install Wget. |
| 4. Change Aliyun Yum. |
| 5. Change Tencent Yum. |
| 6. Quit |
+-------------------------------------------------------------------------+
请在1分钟内作出选择
相关文章:

Shell编程--流程控制
目录 1.条件结构1.1.文件测试(字符串)1.2.字符串比较1.3.数字条件比较1.4.文件条件判断 2.if多条件判断3.case语句 1.条件结构 测试:test 条件 条件为真返回 0,条件为假返回 1 语法:[ 条件 ] test 条件能够理解以下类型的表达式 1.1.…...

设计模式-模板方法模式(Template Method)
设计模式-模板方法模式(Template Method) 一、模板方法模式概述1.1 什么是模板方法模式1.2 简单实现模板方法模式1.3 使用模板方法模式的注意事项 二、模板方法模式的用途三、模板方法模式实现方式3.1 抽象类中定义模板方法,子类实现具体方法…...

远程登录Linux方法(Linux平台相互远程;Windows远程登录Linux、远程编码、文件传输;无法远程登录的问题解决;c程序的编译)
在实际使用Linux系统过程中我们不可避免的需要远程登录Linux,这是因为未来大家使用Linux服务器的时候你所对应的那台Linux服务器不一定提供界面(服务器可能在外地)。本篇将会介绍远程登录Linux的方法。 文章目录 1. SSH介绍2. Linux平台相互远程及文件传输2.1 Linux…...

macOS 13.6 及后续系统安装 Asahi Linux 将破坏引导
导读Asahi Linux 是一个致力于为 Apple Silicon 设备带来 Linux 支持的项目,日前有用户反馈称,若在相关设备上安装了 macOS 13.6-14,再安装 Asahi Linux ,就会导致系统引导失败,出现“黑屏”情况。 目前 Asahi Linux 项…...

Python武器库开发-flask篇之flask框架的安装(二十一)
Flask介绍 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进…...

【CASS精品教程】打开cass提示base.dcl未找到文件的解决办法
打开cass 7.1时提示base.dcl未找到文件的解决办法。 文章目录 一、问题描述二、解决办法 一、问题描述 系统上安装了cad2006cass7.1,cass软件可以正常打开,但是在使用屏幕菜单绘制地图时,选择一个工具,提示base.dcl未找到文件&am…...

[vim]Python编写插件学习笔记3 - 命令行参数
0 环境 Windows 11 22H2gVim82 (D:/ProgramFiles/Vim)Python311 (D:/ProgramFiles/Python311)Vundle v0.10.2 阅读本文前,需要先了解前文: 《[vim]Python 编写插件学习笔记1 - 开始》 《[vim]Python 编写插件学习笔记2 - 分离》 1 前提说明 由于本…...

【仙逆】王林400年晋升元婴,复仇藤化元杀尽藤姓,高老畏罪自裁
Hello,小伙伴们,我是小郑继续为大家深度解析国漫资讯。 深度爆料仙逆第10集剧情解析,高启明,缥缈宗的元婴初期老祖,一生潜心研究推演之术,洞察先机,乃是宗门之人的精神支柱。藤化元曾为寻找王林父母所在之…...

云原生实战课大纲
1. 云原生是什么 原生应用(java,pyrhon) 上云的过程应用上云遇到的问题1.微服务的拆分 微服务的访问关系应用的架构云原生适合什么样的人去学具备什么样的前提条件云原生要学习什么docker k8s devlops server mesh jks k8s监控吧自己的微服务部署上…...

数据湖架构
数据湖架构介绍 数据湖(Data Lake)是一个存储大量结构化和非结构化数据的集中式数据存储库。 与传统的数据仓库不同,数据湖采用扁平化结构,将数据存储在原始形式下,不需要进行预处理或转化。这使得数据湖能够同时支持…...

Zabbix 5.0部署(centos7+server+MySQL+Apache)
环境 系统IPZABBIX版本主机名centos7192.168.231.2195.0zabbix-server 安装zabbix 我选择版本是zabbix-5.0 zabbix的官网是Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution 安装Zabbix软件源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/…...

YOLO改进系列之注意力机制(CloAttention模型介绍)
CloAttention来自清华大学的团队提出的一篇论文CloFormer,作者从频域编码的角度认为现有的轻量级视觉Transformer中,大多数方法都只关注设计稀疏注意力,来有效地处理低频全局信息,而使用相对简单的方法处理高频局部信息。很少有方…...

openssl+AES开发实例(linux)
文章目录 一、AES介绍二、AES原理三、AES开发实例 一、AES介绍 AES(Advanced Encryption Standard)是一种对称密钥加密标准,它是一种对称加密算法,意味着相同的密钥用于加密和解密数据。AES 是 NIST(美国国家标准与技…...

FreeRTOS源码阅读笔记3--queue.c
消息队列可以应用于发送不定长消息的场合,包括任务与任务间的消息交换,队列是 FreeRTOS 主要的任务间通讯方式,可以在任务与任务间、中断和任务间传送信息,发送到 队列的消息是通过拷贝方式实现的,这意味着队列存储…...

云原生Kubernetes系列 | 通过容器互联搭建wordpress博客系统
云原生Kubernetes系列 | 通过容器互联搭建wordpress博客系统 通过容器互联搭建一个wordpress博客系统。wordpress系统是需要连接到数据库上的,所以wordpress和mysql的镜像都是需要的。wordpress在创建过程中需要指定一些参数。创建mysql容器时需要把mysql的数据保存在宿主机本…...

java读取OPC DA数据---Utgard
java读取OPC DA数据—Utgard Utgard库已经过时,原作者早已删除库,建议使用OPC UA,兼容OPC DA。 下面讲解Utgard使用 C#和C都不用配置DCOM,直接调用函数 既然是非要用Java,那就别想太方便,需要配置DCOM(后…...

在 Android 上简单安全地登录——使用凭证管理器和密钥
我踏马很高兴地听说, Credential Manager的公开版本将于 11 月 1 日开始提供。Credential Manager 为 Android 带来了身份验证的未来,简化了用户登录应用程序和网站的方式,同时使其更加安全。 登录可能具有挑战性 - 密码经常使用,…...

【Python】上市公司数据进行经典OLS回归实操
一、题目二、数据合并、清洗、描述性统计1、数据获取2、数据合并3、选择董监高薪酬作为解释变量的理论逻辑分析 三、多元回归模型的参数估计、结果展示与分析1、描述性统计分析2、剔除金融类上市公司3、对所有变量进行1%缩尾处理4、0-1标准化,所有解释变量5、绘制热…...

科研学习|科研软件——有序多分类Logistic回归的SPSS教程!
一、问题与数据 研究者想调查人们对“本国税收过高”的赞同程度:Strongly Disagree——非常不同意,用“0”表示;Disagree——不同意,用“1”表示;Agree--同意,用“2”表示;Strongly Agree--非常…...

微服务简单理解与快速搭建
分布式和微服务 含义 微服务架构 微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服…...

QColorDialog开发实例
文章目录 一、QColorDialog基本用法:二、QColorDialog详解三、QColorDialog接口说明静态函数成员函数 四、QColorDialog代码开发实例 QColorDialog 是 Qt 框架中用于选择颜色的对话框类。它提供了一个用户友好的界面,允许用户选择颜色。以下是 QColorDi…...

linux实现全局快捷键
文章目录 第一步:加载KF5GlobalAccel库第二步:代码实现2.1 定义一个QAction2.2 KGlobalAccel::self()注册快捷键3 源码地址有一个需求,就是在应用在后台运行时,用户可以通过快捷键将应用唤起。或者应用响应。 其实就是全局快捷键的功能。 这个功能利用了linux操作系统中的d…...

共享台球室小程序系统:智能化预约与管理
在当今数字化的时代,共享经济模式已经渗透到各个领域。其中,共享台球室作为一个结合了传统与现代元素的项目,越来越受到年轻人的喜爱。为了满足市场需求,我们设计了一款基于微信小程序的共享台球室预约与管理系统,通过…...

百度文心一言
1分钟了解一言是谁? 一句话介绍【文心一言】 我是百度研发的人工智能模型,任何人都可以通过输入【指令】和我进行互动,对我提出问题或要求,我能高效地帮助你们获取信息、知识和灵感哦 什么是指令?我该怎么和你互动&am…...

225.用队列实现栈(LeetCode)
思路 思路:用两个队列实现栈后进先出的特性 ,两个队列为空时,先将数据都导向其中一个队列。 当要模拟出栈时,将前面的元素都导入另一个空队列,再将最后一个元素移出队列 实现 实现: 因为C语言没有库可以…...

汽车FMCW毫米波雷达信号处理流程(推荐---基础详细---清楚的讲解了雷达的过程---强烈推荐)
毫米波雷达在进行多目标检测时,TX发射一个Chirp,在不同距离下RX会接收到多个反射Chirp信号(仅以单个chirp为例)。 雷达通过接收不同物体的发射信号,并转为IF信号,利用傅里叶变换将产生一个具有不同的分离峰值的频谱,每个峰值表示在特定距离处存在物体。 请问,这种多目标…...

8.指令格式,指令的寻址方式
目录 一. 指令格式 二. 扩展操作码 三. 指令寻址 (1)指令寻址 (2)数据寻址 1.直接寻址 2.间接寻址 3.寄存器寻址 4.寄存器间接寻址 5.隐含寻址 6.立即寻址 7.基址寻址 8.变址寻址 9.相对寻址 10.堆栈寻址 一. 指令…...

k8s自定义Endpoint实现内部pod访问外部应用
自定义endpoint实现内部pod访问外部应用 endpoint除了可以暴露pod的IP和端口还可以代理到外部的ip和端口 使用场景 公司业务还还没有完成上云, 一部分云原生的,一部分是实体的 业务上云期间逐步实现上云,保证各个模块之间的解耦性 比如使…...

[100天算法】-分割等和子集(day 78)
题目描述 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:输入:…...

共享台球室小程序系统的数据统计与分析功能
随着共享经济的繁荣发展,共享台球室作为一种新型的娱乐方式,越来越受到年轻人的喜爱。为了更好地满足用户需求和提高管理效率,我们设计了一款基于微信小程序的共享台球室预订与管理系统。该系统不仅具备基本的预订和管理功能,还集…...