lv3 嵌入式开发-7 linux shell脚本编程(分支语句、循环语句)

目录

1 分支语句

2 多路分支语句

3 for的用法

4 while的用法

5 循环控制语句

6 练习


1 分支语句

语法结构:

         if    表达式then  命令表fi    

如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。 if和fi是条件语句的语句括号, 必须成对使用; 命令表中的命令可以是一条, 也可以是若干条。

示例:

//示例1
#!/bin/bash read -p "input a filename:" file  //判断文件或者目录是否存在#test -e $file
#echo $?
if test -e $file                  //等同于 if [ -e $file ],注意空格不能随便删除
then echo "$file exist"            //如果存在文件名或者目录名会输出
fi//示例2
#!/bin/bash read -p "input a filename:" file  //判断文件或者目录是否存在if test -e $file                  //等同于 if [ -e $file ],注意空格不能随便删除
then                              echo "$file exist"            //如果存在文件名或者目录名会输出
elseecho "$file is not exist"echo "please check"
fi//示例3
#!/bin/bash 
read -p "input a filename:" file  //判断文件或者目录是否存在if [ -f $file ]                    //是否是普通文件                 
then                               //if 和 elif 都必须加thenecho "$file is a file"            
elif [ -d $file ]                   //是否是目录
thenecho "$file is a dir"
elseecho "$file is not a file or a dir"
fi

 

语法结构:

        if      表达式then 命令表1else  命令表2fi

如果表达式为真, 则执行命令表1中的命令, 再退出if语句; 否则执行命令表2中的语句, 再退出if语句. 注意: 无论表达式是否为真, 都有语句要执行. 

示例:

判断用户是否存在,如果存在,打印存在,如果不存在,打印不存在。

之前的作法:

其中^正则表达式,代表第一个是linux;wc -l 统计字符,大于0说明存在。

使用脚本写法:

#!/bin/bash RET=`grep "^linux:" /etc/passwd | wc -l`
if [ $RET -eq 1 ]                                 
then echo "exist"    	        
elseecho "not exist"
fi

test命令使用总结

test命令测试的条件成立时, 命令返回值为真(0),否则返回值为假(非0).

2 多路分支语句

多路分支语句case用于多重条件测试, 语法结构清晰自然.  其语法为:

示例:

判断输入的是yes/YES/y/Y 还是no/NO/N/n

#!/bin/bash read -p "input yes/no: " valcase $val inyes | y)echo "input yes";;YES | Y)echo "input YES";;no | n)echo "input no";;NO | N)echo "input NO";;
esac

 示例:

#!/bin/bash #学生成绩分级管理
#90-100 A
#70-90 B
#60-70 C
#0-59 Dread -p "input score:" val#-o 或
#-a 与
#! 非
# 等同于if [ $val -gt 100 ] || [ $val -lt 0]  #0-100
if [ $val -gt 100 -o $val -lt 0]  #0-100
thenecho "input error val"exit
fival=`expr $val / 10`
case $val in9 | 10)echo "A";;7 | 8)echo "B";;6)echo "C";;*)echo "D";;  #只有最后一个双分号可以省略
esac

3 for的用法

当循环次数已知或确定时,使用for循环语句来多次执行一条或一组命令。格式为:

	for   变量名   in   单词表do命令表done

变量依次取单词表中的各个单词,  每取一次单词, 就执行一次循环体中的命令.  循环次数由单词表中的单词数确定. 命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。

如果单词表是命令行上的所有位置参数时, 可以在for语句中省略 “in  单词表” 部分。 

示例

#!/bin/bash filename=`ls`
for file in $filename 
doif [ -f $file ] #可以对文件/目录进行分类管理thenecho "$file is a file"elseecho "$file is not a file"fi 
done

“$@” 每个内容是单独的个体

“$*” 是一个整体

//示例1
#!/bin/bash for val in $@
doecho "$val"
done//结果
linux@linux:~/shell$ ./for.sh 1 2 3 4
1
2
3
4//示例2
#!/bin/bash for val in $*
doecho "$val"
done//结果
linux@linux:~/shell$ ./for.sh 1 2 3 4
1
2
3
4//示例3
#!/bin/bash for val in "$@"
doecho "$val"
done//结果
linux@linux:~/shell$ ./for.sh 1 2 3 4
1
2
3
4//示例4
#!/bin/bash for val in "$*"
doecho "$val"
done//结果
linux@linux:~/shell$ ./for.sh 1 2 3 4
1 2 3 4

示例

#!/bin/bash
#for file in 1 2 3 4 5   下面双括号等同C语言用法
for ((i = 0; i < 5; i = i+1))
do echo "$file"
done

4 while的用法

语法结构为:

while    命令或表达式do命令表done

while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。  

while语句的退出状态为命令表中被执行的最后一条命令的退出状态。 

示例

#!/bin/bashi=0
#while [ $i -lt 5 ] 
while (( i < 5 ))
doecho "$i"i=`expr $i + 1`
done

5 循环控制语句

break 和 continue 

break  n  则跳出n层;       

continue语句则马上转到最近一层循环语句的下一轮循环上,       

continue  n则转到最近n层循环语句的下一轮循环上.

示例

#!/bin/bashi=0
#while [ $i -lt 5 ] 
while (( i < 5 ))
doecho "$i"if [ $i == 3 ]thenbreak   #跳出本层循环       0 1 2 3#continue   #跳出本次循环   0 1 2 3 3 3会一直打印3fii=`expr $i + 1`
done

6 练习

将当前目录下的普通文件,归档到hello.tar中;

#!/bin/bashfilename=`ls`
for file in $filename
doif [ -f $file ]then tar -rf hello.tar $filefi
done

计算下5!(5的阶乘)的结果,并打印出来;

#!/bin/bash
i=5
RET=1
while (( i > 1 ))
doRET=`expr $RET \* $i `i=`expr $i - 1`
done
echo $RET

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LinkedList(4):多线程LinkedList 不安全情况

多线程不安全演示&#xff0c;线程越多&#xff0c;现象越明显&#xff0c;这边只启了四个线程。 package com.example.demo;import java.util.LinkedList; import java.util.UUID;public class LInkedListThread {public static void main(String[] args) {final LinkedList&…

Notepad++下载安装

自己在 找Notepad发现网上的网址参差不齐&#xff0c;自己找到的一个不错下载链接见文末&#xff01; Notepad 是一个免费的代码编辑器&#xff0c;专为在微软 Windows 环境下使用。它是一个开源项目&#xff0c;采用 GPL 许可证&#xff0c;并使用 C 编程语言结合 Win32 API 和…

ZLMeidaKit在Windows上启动时:计算机中丢失MSVCR110.dll,以及rtmp推流后无法转换为flv视频流解决

场景 ZLMediaKit在Windows上实现Rtmp流媒体服务器以及模拟rtmp推流和http-flv拉流播放&#xff1a; ZLMediaKit在Windows上实现Rtmp流媒体服务器以及模拟rtmp推流和http-flv拉流播放_zlm流媒体服务器_霸道流氓气质的博客-CSDN博客 按照以上教程启动MediaServer.exe时提示&am…

深入浅出AXI协议(4)——猝发传输

一、前言 在之前的文章中&#xff0c;我们着重介绍了关于AXI4的握手协议它可以使得传输的双方都可以自如地控制传输的速率&#xff0c;我们主要介绍了握手协议出现的3种可能情况。然后对于AXI4交易通信的握手信号的关系做出了介绍&#xff1a;&#xff08;1&#xff09;在AXI4互…

【webrtc】接收/发送的rtp包、编解码的VCM包、CopyOnWriteBuffer

收到的rtp包RtpPacketReceived 经过RtpDepacketizer 解析后变为ParsedPayloadRtpPacketReceived 分配内存,执行memcpy拷贝:然后把 RtpPacketReceived 给到OnRtpPacket 传递:uint8_t* media_payload = media_packet.AllocatePayload(rtx_payload.size());RTC

ExpressLRS开源代码之框架结构

ExpressLRS开源代码之框架结构 1. 源由2. Arduino应用框架3. ExpressLRS应用框架4. 硬件设计框架4.1 单天线4.2 双天线单PA4.3 双天线双PA 5. 应用软件设计6. 参考资料 1. 源由 最近为了理解《ExpressLRS开源之基本调试数据含义》&#xff0c;做了一些源代码的研读。 概念、文…

二进制搭建kubernetes(K8S)

二进制搭建kubernetes&#xff08;K8S&#xff09; 一、常见的K8S部署方式1.Minikube2.Kubeadmin3.二进制安装部署 二、二进制搭建K8S(单台master)1.部署架构规划2.系统初始化配置3.部署 docker引擎4.部署 etcd 集群4.部署 Master 组件5.部署 Worker Node 组件6.部署网络组件 三…

数据可视化工具中的显眼包:奥威BI自带方案上阵

根据经验来看&#xff0c;BI数据可视化分析项目是由BI数据可视化工具和数据分析方案两大部分共同组成&#xff0c;且大多数时候方案都需从零开始&#xff0c;反复调整&#xff0c;会耗费大量时间精力成本。而奥威BI数据可视化工具别具匠心&#xff0c;将17年经验凝聚成标准化、…

【juc】ReentrantReadWriteLock之缓存(仅当学习)

目录 一、说明二、代码示例2.1 pom依赖2.2 示例代码2.3 实体类 三、示例截图 一、说明 1.针对于读多写少的情况 2.先查缓存&#xff0c;没有再去查库 二、代码示例 2.1 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"h…

文心一言api接入如何在你的项目里使用文心一言

文心一言api接入在项目里接入文心一言 一、百度文心一言API二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API 基于百度文心一言语言大模型的智能文本对话AI机器人…

Linux代码初试__进度条

前言 在我们的日常生活中&#xff0c;进度条是十分常见的&#xff0c;比如在软件下载中&#xff0c;应用加载中等等~~~那么进度条有什么特点&#xff1f;他又如何实现。 下面我们将结合下面的图展开讲解 一、前置理论知识 1.1回车和换行的区别 在我们的日常生活中&#x…

Android Studio新版本New UI及相关设置丨遥遥领先版

1、前言 俗话说工欲善其事必先利其器嘛&#xff0c;工具用不好怎么行呢&#xff0c;借着Android Studio的更新&#xff0c;介绍一下新版本中的更新内容&#xff0c;以及日常开发中那些好用的设置。 2、关于新版本 2.1、最新正式版本 Android Studio Giraffe | 2022.3.1 Pat…

FreeRTOS中断与任务之间同步(Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,422 )

前言&#xff1a; FreeRTOS中&#xff0c;中断需要注意几点&#xff1a; 何时使用中断&#xff1b;中断服务函数&#xff08;ISR&#xff09;要处理的数据量有多大&#xff0c;通常我们希望中断的切换越快越好&#xff0c;也就是说&#xff0c;ISR尽量采用耗时较少的处理方式…

YOLO目标检测——赛马数据集下载分享

目标检测赛马数据集在马匹竞赛、马匹健康监测、马匹行为研究、马匹安全监控和马匹图像检索等应用场景中具有广泛的应用潜力&#xff0c;可以为马匹产业的发展和管理提供有力支持 数据集点击下载&#xff1a;YOLO赛马数据集640图片标框.rar 更多数据集下载和效果展示&#x…

论文研读|生成式跨模态隐写发展综述

前言&#xff1a;本文介绍近5年来生成式跨模态隐写领域的相关工作。 相关阅读&#xff1a;生成式文本隐写发展综述 不同于文本隐写&#xff0c;跨模态隐写需要考虑不同模态间的相关性&#xff0c;常见的跨模态场景有&#xff1a;Image-to-Text&#xff08;如图像描述&#xff…

安全编程:初始化那些你忽略掉的东西

对于黑客来说&#xff0c;特权提升漏洞是令他感到非常兴奋的事情&#xff0c;而有时候这种漏洞的来源仅仅是因为开发者忘记将内存缓冲区中的垃圾数据进行初始化。此话怎讲&#xff1f; 我想&#xff0c;现在每个人都应该熟悉 SecureZeroMemory 函数的使用&#xff0c;它用来擦…

【TypeScript】一直提示 :无法重新声明块范围变量

【TypeScript】一直提示 &#xff1a;无法重新声明块范围变量 问题描述&#xff1a;在VSCode中编写ts代码时&#xff0c;编写保存完之后&#xff0c;通过tsc 文件名.ts编译就会看到变量名下面出现了红色的波浪线&#xff0c;提示的内容是无法重新声明块范围变量。 解决方法&am…

基于RabbitMQ的模拟消息队列之五——虚拟主机设计

文章目录 一、创建VirtualHost类二、初始化三、API1.创建交换机2.删除交换机3.创建队列4.删除队列5.创建绑定6.删除绑定7.发送消息转发规则 8.订阅消息1.消费者管理2.推送消息给消费者 3.添加一个消费者管理ConsumerManager9.确认消息 创建VirtualHost类。 1.串起内存和硬盘的数…

安全基础 --- js的闭包和this属性

js闭包 简介 一个函数和对其周围状态&#xff08;lexical exviroment&#xff0c;词法环境&#xff09;的引用捆绑在一起&#xff08;或者说函数被引用包围&#xff09;&#xff0c;这样的组合就是闭包&#xff08;closure&#xff09; 在js中&#xff0c;通俗来讲&#xff0c…

uni-app 之 安装uView,安装scss/sass编译

uni-app 之 安装uView&#xff0c;安装scss/sass编译 image.png image.png image.png 点击HBuilder X 顶部&#xff0c;工具&#xff0c;插件安装&#xff0c;安装新插件 image.png image.png 安装成功&#xff01; 注意&#xff0c;一定要先登录才可以安装 image.png 1. 引…