条件判断、流程控制以及循环语句

news/2023/5/28 8:07:39

文章目录

  • 1、条件判断语法结构
    • 1.1 条件判断语法格式
    • 1.2 条件判断相关参数(常用)
  • 2、流程控制语句
    • 2.1 基本语法结构
    • 2.2 应用案例
  • 3、循环语句

1、条件判断语法结构

1.1 条件判断语法格式

格式1:test 条件表达式
格式2:[ 条件表达式 ]
格式3:[[ 条件表达式 ]] 支持正则 =~

特别说明:[ ] 和 [[ ]] 两边都有空格

更多判断可以采用man test 去查看,很多参数都用来进行条件判断

有空格和无空格区别:

[条件表达式]  	#无空格
[ 条件表达式 ]	#有空格[[条件表达式]]  	#无空格
[[ 条件表达式 ]]	#有空格

1.2 条件判断相关参数(常用)

判断文件类型

判断参数含义
-e判断文件是否存在(任何类型文件)
-f判断文件是否存在并且是一个普通文件
-d判断文件是否存在并且是一个目录
-L判断文件是否存在并且是一个软连接文件
-b判断文件是否存在并且是一个块设备文件
-S判断文件是否存在并且是一个套接字文件
-c判断文件是否存在并且是一个字符设备文件
-p判断文件是否存在并且是一个命名管道文件
-s判断文件是否存在并且是一个非空文件(有内容)
[ -d ./test1 ];echo $?	#判断当前目录下是否存在名为test1的目录,如果存在,打印结果为0[ -L ./test2 ];echo $?	#判断当前目录下是否存在名为test1的软链接,如果存在,打印结果为0[ ! -f ./test2 ];echo $?	#如果当前目录下不存在名为test2的普通文件,则打印0

判断文件权限

判断参数含义
-r当前用户对其是否可读
-w当前用户对其是否可写
-x当前用户对其是否可执行
-u是否有suid,高级权限冒险位
-g是否sgid,高级权限强制位
-k是否有t位,高级权限粘滞位

判断文件新旧

说明:这里的新旧指的是文件的修改时间

判断参数含义
file1 -nt file2比较file1是否比file2新
file1 -ot file2比较file1是否比file2旧
file1 -ef file2比较是否为同一个文件,或者用于判断硬链接是否指向同一个inode

判断整数

判断参数含义
-eq相等
-ne不等
-gt大于
-lt小于
-ge大于等于
-le小于等于

判断字符串

判断参数含义
-z判断是否为空字符串,字符串长度为0则成立
-n判断是否为非空字符串,字符串长度不为0则成立
string1 = string2判断字符串是否相等
string1 != string2判断字符串是否相不等

多重条件判断

判断符号含义举例
-a 和 &&逻辑与[ 1 -eq 1 -a 1 -ne 0 ] [ 1 -eq 1 ] && [ 1 -ne 0 ]
-o 和 ||逻辑或[ 1 -eq 1 -o -ne 1 ] [ 1 -eq 1 ]

特别说明:
前面的表达式为真,才会执行后面的代码
前面的表达式为假,才会执行后面的代码
只用于分割命令或表达式
&& 和 || 没有优先级,从左往右依次计算

数值比较

[ $(id -u) -eq 0 ] && echo "admin"		#如果当前用户为root,则打印admin[ $(id -u) -eq 0 ] || echo "user"		#如果当前用户不为root,则打印user

类C风格比较

注意:在(())中,=表示赋值,==表示判断
((1==2));echo $?
((1<2));echo $?
((2>=1));echo $?
((2!=1));echo $?
((`id -u`==0));echo $?
((a=123));echo $a
unset a
((a==123));echo $?

字符串比较

a="hello world";b="world"
[ $a = $b ];echo $?
[ "$a" = "$b" ];echo $?`	#判断字符串相等
[ "$a" != "$b" ];echo $?
[ "$a" !== "$b" ];echo $?	#错误写法
[ "$a" == "$b" ];echo $?	#判断字符串相等
test "$a" != "$b";echo $?

[ ] 和 [[ ]]的区别

区别1:
[root@fl ~]# a=
[root@fl ~]# [ $a = hello ];echo $?
bash: [: =: unary operator expected
2
[root@fl ~]# [ $a = "hello" ];echo $?
bash: [: =: unary operator expected
2
[root@fl ~]# [ "$a" = "hello" ];echo $?
1
[root@fl ~]# [[ $a = hello ]];echo $?
1区别2:
[root@fl Shell]# [ -e test1.sh && 1 -eq 1 ];echo "正确"
bash: [: missing `]'
正确
[root@fl Shell]# [[ -e test1.sh && 1 -eq 1 ]];echo "正确"
正确

总的来说:[[ ]] 还支持逻辑操作符 && 和 ||,支持正则表达式,支持整数比较符(=、>、<、>=、<=),而[ ] 不支持

2、流程控制语句

2.1 基本语法结构

if结构

if [ condition ];thencommand
fiif test conditon;thencommand
fiif [[ condition ]];thencommand
fi[ 条件 ] && command

if…else结构

if [ condition ];thencommand1elsecommand2
if[ 条件 ] && command1 || command2

案例:让用户自己输入字符串,如果输入"hello",则打印"world",否则打印"请输入hello"

#!/bin/env bash read -p "请输入一个字符串" strif [ "$str" = "hello" ];thenecho "world"
else echo "请输入hello"
fi

if…elif…else结构

if [ condition1 ];thencommand1	#结束		
elif [ condition2 ];thencommand2	#结束
elsecommand3	#结束
fi

2.2 应用案例

案例1:判断当前主机是否和远程主机是否ping通

#!/bin/env bash# 用户输入对端主机
read -p "请输入对端主机IP:" ip# ping 10次
ping -c 10 ${ip} &>/dev/null 	#/dev/null是一个黑洞文件,往里面写的数据都将被丢弃# 判断是否互通
if [ $? -eq 0 ];thenecho "当前主机和远程主机${ip}是互通的"
elseecho "当前主机和远程主机${ip}不是互通的"
fi

案例2:判断web服务器中的httpd进程是否存在

# 方法1
ps -axj | grep httpd | grep -v "grep" &>/dev/null  # grep -v "grep" 表示除去当前的grep进程if [ $? -eq 0 ];thenecho "httpd进程存在"
elseecho "httpd进程存在"
fi# 方法2
pgrep httpd &>/dev/null
if [ $? -eq 0 ];thenecho "httpd进程存在"
elseecho "httpd进程存在"
fi# 或者
test $? -eq 0 && echo "httpd进程存在" || echo "httpd进程不存在"

pgrep命令
以名称为依据从运行进程队列中查找进程,并显示查找到的进程id
选项:

-o:	仅显示找到的最小(起始)进程号;
-n:	仅显示找到的最大(结束)进程号;
-l:	显示进程名称;
-P: 指定父进程号; pgrep -p 4764 查看父进程下的子进程id
-g: 指定进程组;
-t: 指定开启进程的终端;
-u: 指定进程的有效用户ID

案例3:判断门户网站是否能正常访问

#!/bin/env bash# wget命令用于从一个网站中下载文件,如果能下载成功,则表示该网站能正常访问
web_server=www.baidu.com
wget -P /dev/null ${web_server} &>/dev/null		#-P 表示下载文件的保存路径if [ $? -eq 0 ];thenecho "能正常访问"
elseecho "不能正常访问"
fi

3、循环语句

列表for循环

for variable in {list}docommandcommand...done或者
for variable in a b cdocommandcommand...done
#打印1-10 以下写法结果一样
for i in {1..10}; do echo &i; doneseq 10for i in $(seq 10); do echo $i; donefor i in 1 2 3 4 5 6 7 8 9 10; do echo $i; done#打印1 3 5 7 9 以下写法结果一样
for i in{1..10..2}; do echo $i; doneseq 1 2 10#打印10-1 以下写法结果一样
for i in {1..10..-1}; do echo $i; doneseq 10 -1 1

不带列表循环
不带列表的for循环执行时由用户指定参数和参数的个数

for variabledocommandcommand...done

举例说明

#!/bin/env bash for i	#只有一个i,没有范围
doecho "hello"
done[root@fl Shell]# bash test8.sh
[root@fl Shell]# bash test8.sh a
hello
[root@fl Shell]# bash test8.sh a b
hello
hello# 为什么要带参数才能有执行结果
[root@fl Shell]# bash -x test8.sh a  #会将其解释为以下结果
+ for i in '"$@"'		# "$@"表示脚本后面的所有参数,因此有几个参数就循环几次
+ echo hello
hello

类C风格的for循环

for(( expr1;expr2;expr3 ))docommandcommand...donefor(( i=1;i<=5;i++))doecho $idoneexpr1:定义变量并赋初值
expr2:决定是否进行循环(条件)
expr3:决定循环变量如何改变,决定循环什么时候退出

循环体:do…done之间的内容

  • continue:结束当前循环,进行下次循环
  • break:跳出本次循环
  • exit:直接退出程序
  • shift:使位置参数向左移动,默认移动1位,可以使用shift 2

shift案例:

[root@fl Shell]# cat test15.sh 
#!/bin/env bash
sum=0
while [ $# -ne 0 ]
dolet sum=$sum+$1shift
done
echo sum=$sum
[root@fl Shell]# bash test15.sh 1 2 3 4 5
sum=15

在未运行shift命令之前$1是可用的,当使用shift命令之后,原来的$2会变成$1,并且原有的$1变得不可用,通过$#命令获得的参数个数也会少1

案例4:批量创建用户
批量加5个新用户,以u1到u5命名, 并统一加一个新组,组名为class,统一改密码为123

#!/bin/env bash#判断class组是否存在
grep -w ^class /etc/group &>/dev/null
#如果不存在就创建class组
if [ $? -ne 0 ];thengroupadd class#循环创建用户
for i in {1..5}
douseradd -G class u$i #创建用户echo 123 | passwd --stdin u$i &>/dev/null #设置密码
done

案例5:写一个脚本,局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

#!/bin/env bashif [ ! -d `pwd`/tmp ];thenmkdir `pwd`/tmp
fiip=10.1.1for((i=1;i<=10;++i))
doping -c1 $ip.$i &>/dev/nullif [ $? -eq 0 ];thenecho "$ip.$i ping is ok">>./tmp/ip_up.txtelseecho "$ip.$i ping is down">>./tmp/ip_down.txtfi
doneecho "局域网内IP检测完毕"

这样存在一个问题,每次需要等待前一个ping完成后,才能进行下一次ping,并且是前台运行,很耗时,因此可以对代码进行改进

#!/bin/env bashif [ ! -d `pwd`/tmp ];thenmkdir `pwd`/tmp
fiip=10.1.1for((i=1;i<=10;++i))
do
{ping -c1 $ip.$i &>/dev/nullif [ $? -eq 0 ];thenecho "$ip.$i ping is ok">>./tmp/ip_up.txtelseecho "$ip.$i ping is down">>./tmp/ip_down.txtfi
}&
done
wait
echo "局域网内IP检测完毕"并发执行:
{程序}& 表示将程序放到后台并发执行,如果需要等待程序执行完毕再进行后续操作,需要加上wait

while循环

条件为真进入循环,条件未假结束循环

while 表达式docommand...donewhile [ 1 -eq 1] 或者 (( 1 < 2 ))docommand...done

案例6:同步系统时间
需求:
写一个脚本,30秒同步一次系统时间,时间同步服务器www.baidu.com
如果同步失败,则进行邮件报警,每次失败都报警
同步成功,也进行邮件通知,但是成功100次才通知一次

#!/bin/env bashNTP=www.baidu.com
count=0
while true
dontpdate $NTP &>/dev/nullif [ $? -ne 0 ];thenecho "system date failed" | mail -s "check system date" root@localhostelselet count++if [ $count -eq 100 ];thenecho "sysyem date success" | mail -s "check system date" root@localhost && count=0fifisleep 30
done# ntpdate $NTP  本机同步ip地址为NTP的服务器时间  也可换成 rdate -s
# mail -s "check system date" root@localhost  向root发送邮件

until循环
条件未假就进入循环,条件为真就结束循环

untile expreesion docommand...done

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

String test=args[0];提示数据越界为什么,好菜哦,都是细节

String testargs[0];提示数据越界为什么 public class ExTestDrive { public static void main(String[] args){ String testargs[0];

SSH服务器拒绝了密码。请再试一次。解决方法汇总。浪费我一下午的时间,只好承认自己好菜。

问题图 解决方案1&#xff1a;在ubuntu终端中&#xff0c;输入 vim /etc/ssh/sshd_config 找到这段代码 修改为 按insert 开始编辑&#xff0c;编辑结束后按esc&#xff0c;然后输入 &#xff1a;wq即可保存 如果保存不成功&#xff0c;就输入 &#xff1a;wq&#xff01;强制…

预制菜前景可观,怎么打开销路实现有效拓客?

前两天还在某博刷到了预制菜的热搜&#xff0c;据说前景非常可观&#xff0c;不出意外的话&#xff0c;之后应该会有很多商家涌入&#xff0c;这个市场怕是要激烈竞争一番了。 预制菜怎么快速打开销路&#xff0c;找到客户是我们今天要讲的内容。 1、确定目标客户 首先要确定…

《大话设计模式》之--第13章 好菜每回味不同----建造者模式

第13章 好菜每回味不同----建造者模式 13.1炒面没放盐 “小菜&#xff0c;讲了半天&#xff0c;肚子饿得厉害&#xff0c;走&#xff0c;去吃夜宵去。”大鸟摸着肚子说道。 “你请客&#xff1f;” “我教了你这么多&#xff0c;你也不打算报答一下&#xff0c;还要我请客?…

四川泡菜母水做法 如何做泡菜母水

四川有很多闻名全国的美食&#xff0c;四川泡菜就是嘉许胡晓的存在&#xff0c;据说在四川很多地区&#xff0c;家家户户都有祖传下来的老坛泡菜水&#xff0c;他也被人们称为四川泡菜母水&#xff0c;很多其它地区的人都想学习这种泡菜母水的制作方法&#xff0c;想让自己的家…

jfow-core 代码分析

EntityNoName目录概述需求&#xff1a;设计思路实现思路分析1.code:2.code2&#xff1a;3.FLows4.frm5.code3:code4:EntityTreeAttrEntitiesNoNameenum:JUmp way参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full bu…

32岁辞职读博,博三还没有文章,焦虑,如何调节?

链接&#xff1a;https://www.zhihu.com/question/418159010编辑&#xff1a;深度学习与计算机视觉声明&#xff1a;仅做学术分享&#xff0c;侵删可能因为在企业工作过&#xff0c;觉得自己现在研究的东西全是表面功夫&#xff0c;一点不实用。导师不管&#xff0c;不发钱&…

38.“财务自由“,喂给创业者的童话故事

现在我们拼搏两三年&#xff0c;等公司上市后&#xff0c;就实现财务自由&#xff0c;就能过上好日子。上面是我看到有些人拉创业者入伙时说的话&#xff0c;很具有蛊惑性。我很疑惑&#xff0c;怎么“财务自由”就和“过上好日子”画上了等号呢&#xff1f;记得“财务自由”这…

普通人怎么去赚钱?想实现财务自由只能去创业。丨国仁网络资讯

大家好&#xff0c;我是猫哥&#xff0c;今天要给大家分享的仍然是怎么去赚钱&#xff0c;我们就死磕赚钱。 近朱者赤近墨者黑。这是我一直信奉的一句真理。如果你身边的人都是穷人&#xff0c;那么你毫无意外&#xff0c;一定也是一个穷人&#xff0c;如果你身边有很多富人&a…

亚马逊云科技携手普华永道,助力泉峰集团破解数据治理与使用难题

大数据时代的到来&#xff0c;掀起了企业数字化转型的热潮&#xff0c;对于制造行业的企业来说&#xff0c;除了顺应发展潮流快速开启数字转型之外&#xff0c;以创新思维不断拓展业务广度&#xff0c;对于自身发展也有着格外重要的意义。数字化水平能否与创新发展的脚步保持一…

(二十三:2020.12.14)CVPR 2020 学习(二)《U^2 Net》

《U^2 Net: Going Deeper with Nested U-Structure for Salient Object Detection》《借助嵌套U型结构深入研究显着物体》讲在前面摘要论文内容1.介绍2.之前的相关工作2.1 多级的深度特征整合2.2 多尺度特征提取3.我们提出的方法3.1 残差U型块3.2 U2-Net的结构3.3 监督策略4.实…

SVM入门(六)至(十)

原文转自&#xff1a;http://www.blogjava.net/zhenandaci/archive/2009/03.html 感谢原创作者~~ SVM入门&#xff08;六&#xff09;线性分类器的求解——问题的转化&#xff0c;直观角度 让我再一次比较完整的重复一下我们要解决的问题&#xff1a;我们有属于两个类别的样本…

SVM入门(十)将SVM用于多类分类

&#xfeff;&#xfeff;&#xff08;一&#xff09;SVM的八股简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的&#xff0c;它在解决小样本、非线性及高维模式识别中表现出许多特有的优势&#xff0c;并能够推广应用到函数拟合等其他机器学习问题…

SVM入门(五)到十

从最一般的定义上说&#xff0c;一个求最小值的问题就是一个优化问题&#xff08;也叫寻优问题&#xff0c;更文绉绉的叫法是规划——Programming&#xff09;&#xff0c;它同样由两部分组成&#xff0c;目标函数和约束条件&#xff0c;可以用下面的式子表示&#xff1a; &…

网随电通!海思PLC技术致创能源,让城市路灯更智慧

2020年以来&#xff0c;随着中央一系列会议对“新基建”密集部署&#xff0c;新基建已成为未来中国经济发展的新引擎。5G智慧路灯杆作为新基建建设的主要载体&#xff0c;已经受到各地政府的普遍认可和重视。 那么除了在路灯上安装5G、各种传感器等高大上的应用&#xff0c;还…

基于STM32的实时操作系统FreeRTOS(待更新……)

摘要&#xff1a;RTOS很简单&#xff0c;听起来叫做实时操作系统&#xff0c;有一点吓唬人。但是学起来真的很简单&#xff0c;你不要把他想象的太复杂。这玩意其实就是一个任务调度器&#xff0c;在裸机中程序只有一个死循环&#xff0c;但是使用了RTOS程序中就有了多个死循环…

平台赋能,生态共赢- PLC远程监控

由山东省经信委、省财政厅、省企业上云服务联盟等联合举办的云行齐鲁COSMOPlat专场——青岛站”专题活动会议于今天在海尔冰山之角举行。湖南华辰智通科技有限公司作为主办方的生态合作伙伴&#xff0c;受邀参会。 本次“云行齐鲁COSMOPlat专场——青岛站”专题活动会议由山东省…

西门子plc s7 200数据长度和数值范围及格式

西门子S7-200 plc寻址时&#xff0c;可以使用不同的数据长度。不同的数据长度表示的数值范围不同。S7-200 指令也分别需要不同的数据长度。 S7-200系列在存储单元所存放的数据类型有布尔型( BOOL)、整数型( INT )、实数型和字符串型四种。数据长度和数值范围如表所列。 ● 实数…

Wider Face+YOLOV8人脸检测

YOLO系列的算法更新实在太快了&#xff0c;前些天刚学习完YOLOV7&#xff0c;YOLOV8就出来了。今天先理解模型的训练过程&#xff0c;后续再学习V8的网络结构等细节。YOLOV8源码链接&#xff1a;https://github.com/ultralytics/ultralytics1 数据格式转换Wider Face数据格式转…

plc字符串怎么计算字节数_西门子s7-200plc编译后最大允许字节数是多少?

一、西门子s7-200plc编译后最大允许字节数不同plc存储区是不同的&#xff0c;如226最大是24KB(禁用“运行模式编辑“)。使用”运行模式编辑“为&#xff1a;16KB&#xff0c;禁用“运行模式编辑“这个可以在系统块中进行设置。二、西门子S7-200 PLC数据长度和数值范围西门子S7-…