Linux嵌入式开发——shell脚本
文章目录
- Linux嵌入式开发——shell脚本
- 一、shell脚本基本原则
- 二、shell脚本语法
- 2.1、编写shell脚本
- 2.2、交互式shell脚本
- 2.3、shell脚本的数值计算
- 2.4、test命令
- &&运算符
- ||运算符
- 2.5、中括号[]判断符
- 2.6、默认变量
- 三、shell脚本条件判断
- if then
- if then else
- case
- 四、shell脚本函数
- 不带参数
- 带参数
- 五、shell循环
- while
- until
- for
Linux嵌入式开发——shell脚本
经过我们前面的学习,我们已经能够在终端中输入命令来完成一些常用的操作,但是都是一条一条地输入命令,如果需要执行的命令一旦多起来,就会很麻烦。那么有没有一种方式可以将很多条命令放到一个文件里面,然后直接运行这个文件便可执行这些命令?当然有,这就是我们接下来要介绍的shell脚本!
shell脚本类似windows的批处理文件,就是将连续执行的命令写成一个文件。shell脚本提供数组、循环、条件判断的等功能,一般是Linux运维或者系统管理员要掌握的,但作为嵌入式开发人员,我们只需要掌握shell脚本最基础的部分即可。
一、shell脚本基本原则
shell脚本是个纯文本文件,命令从上而下,一行一行的开始执行。shell脚本扩展名为.sh。而且shell脚本第一行一定要为:
#!/bin/bash
这个表示使用bash。
二、shell脚本语法
2.1、编写shell脚本
接下来,我们来编写第一个简单的shell脚本,主要功能就是在终端显示一下“hello world!”。我们接下来看一下具体的代码吧!
#!/bin/bash
echo "hello world!"
但是我们看一下这个.sh文件的权限吧!
-rw-rw-r-- 1 ygr ygr 32 1月 26 15:08 my.sh
我们可以看到,这个文件是不可执行的,于是我们修改一下权限,让他变成可执行文件。
chmod 777 my.sh
接下来,我们来执行一下这个文件,看一下最后的输出结果是什么。我们可以看到,最后输出了我们的“hello world!”。
ygr@ygr-virtual-machine:~/桌面$ ./my.sh
hello world!
2.2、交互式shell脚本
接下来,我们要接触的就是交互式脚本,我们已经学会在终端打印了,接下来我们来学习一下如何输入。我们使用的命令是read命令,接下来看一下我们的具体代码:
#!/bin/bash
echo "please input name:"
read name
echo "your name:" $name
然后运行效果:
please input name:
chenyi
your name: chenyi
我们的read命令可以加入许多的参数,我们只简单介绍一个,剩下的大家自己去看看。
#!/bin/bash
read -p "please input name and age: " name age
echo "your name = $name, your age = $age."
这个命令,就是用来输入的时候去提示用户的,我们看一下运行结果:
please input name and age: chenyi 30
your name = chenyi, your age = 30.
2.3、shell脚本的数值计算
shell仅支持整形,数值计算我们使用如下语句去进行:
#!/bin/bash
echo "please input two int num: "
read -p "first num: " first
read -p "second num: " second
total=$(($first + $second))
echo "$first + $second = $total"
运行结果:
please input two int num:
first num: 4
second num: 6
4 + 6 = 10
2.4、test命令
test命令主要用于查看文件是否存在、权限等信息,可以进行数值,字符,文件三方面的测试。在这之前,我们先介绍一下&&和||这两个命令:
&&运算符
我们知道,“&&”在C语言里面是与的意思,但是在shell语法里面,这个不是与的意思,但是有一点类似,我们接下来举个例子来看一下。
“cmd1 && cmd2” 的意思就是当cmd1执行完并且正确时,那么cmd2开始执行,如果cmd1执行错误,那么cmd2不执行。只能说有点像C语言里面的短路,接下来我们来介绍一下||运算符。
||运算符
我们知道,“||”在C语言里面是或的意思,但是在shell语法里面,这个不是或的意思,而是或者的意思,我们接下来举个例子来看一下。
“cmd1 || cmd2” 的意思就是当cmd1执行完毕并正确时,cmd2不执行,反之cmd2执行。就是两者执行其一,所以我说是或者的意思。而且这两个命令一般都是结合在一起使用的。
接下来,我们来看一看test命令的具体使用方法吧!
#!/bin/bash
read -p "please input file name: " filename
test -e $filename && echo "$filename exist" || echo "$filename no exist"
运行结果:
please input file name: C-test
C-test exist
这个是来查看文件是否存在,我们接下来看一看字符串的判断:
#!/bin/bash
echo "please input two string: "
read -p "first string: " first
read -p "second string: " second
test $first == $second && echo "equality" || echo "inequality"
运行结果:
please input two string:
first string: qwert
second string: qwert
equalityplease input two string:
first string: qwe
second string: asd
inequality
2.5、中括号[]判断符
[ ]判断符,顾名思义,就是用来判断的,但是里面只能输入 ==或 !=,接下来我们来看一下具体的使用方法:
#!/bin/bash
echo "please input two string: "
read -p "first string: " first
read -p "second string: " second
[ "$first" == "$second" ] && echo "equality" || echo "inequality"
这个命令与上面那个命令是等价的。但是要注意,变量要加上双引号。
2.6、默认变量
我们接下来介绍一下默认变量,接下来我们来看一些默认变量:
-
$0 ~ $n,表示shell脚本的参数,包括shell脚本命令本身,shlle脚本命令本身为$0
-
$#:#表示最后一个参数的标号。
-
$@:表$1、$2、$3…
我们来看一下具体的代码:
#!/bin/bash
echo "file name:" $0
echo "total parameter num: " $#
echo "all paramenters: " $@
echo "first paramenters: " $1
echo "second paramenters: " $2
运行结果:
ygr@ygr-virtual-machine:~/桌面$ ./my.sh qw er rt
file name: ./my.sh
total parameter num: 3
all paramenters: qw er rt
first paramenters: qw
second paramenters: er
三、shell脚本条件判断
if then
我们的shell脚本虽然可以通过&&和||来实现简单的条件判断,但是稍微复杂一点的场景就不适合了。所以shell脚本为我们提供了if then条件判断语句,写法如下所示,我们来看一下具体的代码使用:
if 条件判断 ; then
//判断成立要做的事情
fi
1 #!/bin/bash2 3 read -p "please input(Y/N): " value4 if [ "$value" == "Y" ] || [ "$value" == "y" ]; then5 echo "your input is Y !"6 exit 07 fi8 9 if [ "$value" == "N" ] || [ "$value" == "n" ]; then10 echo "your input is N !"11 exit 012 fi
运行结果如下所示:
ygr@ygr-virtual-machine:~/桌面$ ./my.sh
please input(Y/N): y
your input is Y !
ygr@ygr-virtual-machine:~/桌面$ ./my.sh
please input(Y/N): n
your input is N !
if then else
除了if then之外,我们还有if then else 语句,就类似于C语言里面的if else,具体的写法如下所示:
if 条件判断 ; then
//条件判断成立要做的事情
else
//条件判断不成立要做的事情。
fi或:if 条件判断 ; then
//条件判断成立要做的事情
elif [条件判断]; then
//条件判断成立要做的事情
else
//条件判断不成立要做的事情。
fi
我们来看一下具体的代码:
1 #!/bin/bash2 3 read -p "please input(Y/N): " value4 if [ "$value" == "Y" ] || [ "$value" == "y" ]; then5 echo "your input is Y !"6 exit 07 else8 echo "your input is: $value !"9 exit 010 fi
运行结果如下所示:
please input(Y/N): t
your input is: t !please input(Y/N): y
your input is Y !
接下来是elif,我们来看看具体的使用代码:
1 #!/bin/bash2 3 read -p "please input(Y/N): " value4 if [ "$value" == "Y" ] || [ "$value" == "y" ]; then5 echo "your input is Y !"6 exit 07 elif [ "$value" == "N" ] || [ "$value" == "n" ]; then8 echo "your input is: $value !"9 exit 010 else11 echo "your input is not recognized!"12 fi
运行结果:
please input(Y/N): r
your input is not recognized!please input(Y/N): y
your input is Y !please input(Y/N): n
your input is: n !
case
接下来我们来介绍一下case语句,这个与我们在C语言里面的case是类似的,具体的写法如下所示:
case $变量 in“第1个变量内容”)
程序段
;; # 表示该程序块结束!!“第2个变量内容”)
程序段
;;“第n个变量内容”)
程序段
;;esac
接下来我们来看一看具体的代码实现:
1 #!/bin/bash2 3 case $1 in4 "chen")5 echo "chen yi is my baby!"6 ;;7 "ye")8 echo "ye! happy every day!"9 ;;10 *)11 echo "your input is not recognized!"12 ;;13 esac
运行结果如下所示:
ygr@ygr-virtual-machine:~/桌面$ ./my.sh ye
ye! happy every day!ygr@ygr-virtual-machine:~/桌面$ ./my.sh chen
chen yi is my baby!ygr@ygr-virtual-machine:~/桌面$ ./my.sh chr
your input is not recognized!
四、shell脚本函数
不带参数
shell脚本也是支持函数的,不带参数的函数写法如下:
function fname () {# 函数代码段
}
具体的代码如下所示:
1 #!/bin/bash2 3 function help(){4 echo "this is help cmd!"5 }6 7 function close(){8 echo "this is close cmd!"9 }10 11 case $1 in12 "-h")13 help14 ;;15 "-c")16 close17 ;;18 esac
运行结果如下所示:
ygr@ygr-virtual-machine:~/桌面$ ./my.sh -h
this is help cmd!
ygr@ygr-virtual-machine:~/桌面$ ./my.sh -c
this is close cmd!
带参数
接下来我们来介绍一下函数带参数的情况,具体的写法如下所示:
1 #!/bin/bash2 3 print(){4 echo "parameter 1:$1!"5 echo "parameter 2:$2!"6 }7 8 print chen ye
运行结果如下所示:
parameter 1:chen!
parameter 2:ye!
五、shell循环
while
shell脚本也支持循环,比如 while do done,表示当条件成立的时候就一直循环,直到条件不成立,具体的语法格式如下所示:
while [条件] # 括号内的状态是判断式
do # 循环开始# 循环代码段
done
具体的实现代码如下所示:
1 #!/bin/bash2 3 while [ "$value" != "close" ]4 do5 read -p "please input str:" value6 done7 8 echo "stop while!!!"
运行结果如下所示:
please input str:er
please input str:stop
please input str:close
stop while!!!
until
还有另外一种until do done,表示条件不成立的时候循环,条件成立以后就不循环了,具体的语法格式如下所示:
until [条件]
do
//循环代码段
done
具体的实现代码如下所示:
1 #!/bin/bash2 3 until [ "$value" == "close" ]4 do5 read -p "please input str:" value6 done7 8 echo "stop while!!!"
运行结果如下所示:
please input str:co
please input str:close
stop while!!!
for
shell脚本的for循环和python的for非常类似,其实就是因为python其实也算是脚本语言,使用for循环可以知道有循环次数,具体的语法格式如下所示:
for var in con1 con2 con3……
do
# 循环代码段
done#for循环数值处理,写法 for((初始值; 限制值; 执行步长))
do
# 循环代码段
done
具体的语法实现如下所示:
1 #!/bin/bash2 3 for name in ygr cy4 do5 echo "your name is :$name!"6 done
运行结果如下所示:
your name is :ygr!
your name is :cy!
接下来我们看一下另外一个for循环:
1 #!/bin/bash2 3 read -p "please input count: " count4 5 total=06 for((i=0; i<=count; i=i+1))7 do8 total=$(($total+$i))9 done10 11 echo "前n个整数之和为: $total"
运行结果如下所示:
please input count: 5
前n个整数之和为: 15
相关文章:
Linux嵌入式开发——shell脚本
文章目录Linux嵌入式开发——shell脚本一、shell脚本基本原则二、shell脚本语法2.1、编写shell脚本2.2、交互式shell脚本2.3、shell脚本的数值计算2.4、test命令&&运算符||运算符2.5、中括号[]判断符2.6、默认变量三、shell脚本条件判断if thenif then elsecase四、she…...
CV【5】:Layer normalization
系列文章目录 Normalization 系列方法(一):CV【4】:Batch normalization Normalization 系列方法(二):CV【5】:Layer normalization 文章目录系列文章目录前言2. Layer normalizati…...
跳跃游戏 II 解析
题目描述给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处:0 < j < nums[i] i j < n返回到达 nums[n - 1] 的…...
易基因|猪肠道组织的表观基因组功能注释增强对复杂性状和人类疾病的生物学解释:Nature子刊
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。2021年10月6日,《Nat Commun》杂志发表了题为“Pig genome functional annotation enhances the biological interpretation of complex traits and human disease”的研究论文…...
01- NumPy 数据库 (机器学习)
numpy 数据库重点: numpy的主要数据格式: ndarray 列表转化为ndarray格式: np.array() np.save(x_arr, x) # 使用save可以存一个 ndarray np.savetxt(arr.csv, arr, delimiter ,) # 存储为 txt 文件 np.array([1, 2, 5, 8, 19], dtype float32) # 转换…...
RapperBot僵尸网络最新进化:删除恶意软件后仍能访问主机
自 2022 年 6 月中旬以来,研究人员一直在跟踪一个快速发展的 IoT 僵尸网络 RapperBot。该僵尸网络大量借鉴了 Mirai 的源代码,新的样本增加了持久化的功能,保证即使在设备重新启动或者删除恶意软件后,攻击者仍然可以通过 SSH 继续…...
拦截器interceptor总结
拦截器一. 概念拦截器和AOP的区别:拦截器和过滤器的区别:二. 入门案例2.1 定义拦截器bean2.2 定义配置类2.3 执行流程2.4 简化配置类到SpringMvcConfig中一. 概念 引入: 消息从浏览器发送到后端,请求会先到达Tocmat服务器&#x…...
轻松实现微信小程序上传多文件/图片到腾讯云对象存储COS(免费额度)
概述 对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,用户可通过网络随时存储和查看数据。个人账户首次开通COS可以免费领取50GB 标准存储容量包6个月(180天)的额度。…...
Golang中defer和return的执行顺序 + 相关测试题(面试常考)
参考文章: 【Golang】defer陷阱和执行原理 GO语言defer和return 的执行顺序 深入理解Golang defer机制,直通面试 面试富途的时候,遇到了1.2的这个进阶问题,没回答出来。这种题简直是 噩梦\color{purple}{噩梦}噩梦,…...
谁说菜鸟不会数据分析,不用Python,不用代码也轻松搞定
作为一个菜鸟,你可能觉得数据分析就是做表格的,或者觉得搞个报表很简单。实际上,当前有规模的公司任何一个岗位如果没有数据分析的思维和能力,都会被淘汰,数据驱动分析是解决日常问题的重点方式。很多时候,…...
php mysql保健品购物商城系统
目 录 1 绪论 1 1.1 开发背景 1 1.2 研究的目的和意义 1 1.3 研究现状 2 2 开发技术介绍 2 2.1 B/S体系结构 2 2.2 PHP技术 3 2.3 MYSQL数据库 4 2.4 Apache 服务器 5 2.5 WAMP 5 2.6 系统对软硬件要求 6 …...
Vue3电商项目实战-首页模块6【22-首页主体-补充-vue动画、23-首页主体-面板骨架效果、4-首页主体-组件数据懒加载、25-首页主体-热门品牌】
文章目录22-首页主体-补充-vue动画23-首页主体-面板骨架效果24-首页主体-组件数据懒加载25-首页主体-热门品牌22-首页主体-补充-vue动画 目标: 知道vue中如何使用动画,知道Transition组件使用。 当vue中,显示隐藏,创建移除&#x…...
linux 使用
一、操作系统命令 1、版本命令:lsb_release -a 2、内核命令:cat /proc/version 二、debian与CentOS区别 debian德班和CentOS是Linux里两个著名的版本。两者的包管理方式不同。 debian安装软件是用apt(apt-get install),而CentOS是用yum de…...
基于遗传算法的微电网调度(风、光、蓄电池、微型燃气轮机)(Matlab代码实现)
💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…...
方向导数与梯度下降
文章目录方向角与方向余弦方向角方向余弦方向导数定义性质梯度下降梯度下降法(Gradient descent)是一个一阶最优化算法,通常也称为最速下降法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(…...
Java岗面试题--Java基础(日积月累,每日三题)
目录面试题一:Java中有哪些容器(集合类)?追问:Java中的容器,线程安全和线程不安全的分别有哪些?面试题二: HashMap 的实现原理/底层数据结构? JDK1.7 和 JDK1.8追问一&am…...
java基础—Volatile关键字详解
java基础—Volatile关键字详解 文章目录java基础—Volatile关键字详解并发编程的三大特性:volatile的作用是什么volatile如何保证有可见性volatile保证可见性在JMM层面原理volatile保证可见性在CPU层面原理可见性问题的例子volatile如何保证有序性单例模式使用volat…...
内存检测工具Sanitizers
Sanitizers介绍 Sanitizers 是谷歌开源的内存检测工具,包括AddressSanitizer、MemorySanitizer、ThreadSanitizer、LeakSanitizer。 Sanitizers是LLVM的一部分。 gcc4.8:支持Address和Thread Sanitizer。 gcc4.9:支持Leak Sanitizer和UBSani…...
Triton : OpenAI 开发的用于Gpu开发语言
Triton : OpenAI 开发的用于Gpu开发语言https://openai.com/blog/triton/1、介绍 https://openai.com/blog/triton/ 2、git地址 https://github.com/openai/triton 3、论文 http://www.eecs.harvard.edu/~htk/publication/2019-mapl-tillet-kung-cox.pdf SIMD : Single Inst…...
Python文件操作-代码案例
文章目录文件打开文件open写文件上下文管理器第三方库简单应用案例使用python生成二维码使用python操作excel程序员鼓励师学生管理系统文件 变量就在内存中,文件在硬盘中. 内存空间更小,访问速度快,成本贵,数据容易丢失,硬盘空间大,访问慢,偏移,持久化存储. \\在才是 \的含义…...
活动目录(Active Directory)管理,AD自动化
每个IT管理员几乎每天都在Active Directory管理中面临许多挑战,尤其是在管理Active Directory用户帐户方面。手动配置用户属性非常耗时、令人厌烦且容易出错,尤其是在大型、复杂的 Windows 网络中。Active Directory管理员和IT经理大多必须执行重复和世俗…...
Allegro如何使用Vertext命令修改丝印线段的形状操作指导
Allegro如何使用Vertext命令修改丝印线段的形状操作指导 在用Allegro画丝印线段的时候,如果画了一段不是自己需要形状的线段,无需删除重画,可以用Vertext命令直接编辑 如下图 修改前 修改后 具体操作如下 选择Edit...
Leetcode力扣秋招刷题路-0030
从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 30. 串联所有单词的子串 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。…...
基于Prometheus和k8s搭建监控系统
文章目录1、实验环境2、Prometheus介绍?3、Prometheus特点3.1 样本4、Prometheus组件介绍5、Prometheus和zabbix对比分析6、Prometheus的几种部署模式6.1 基本高可用模式6.2 基本高可用远程存储6.3 基本HA 远程存储 联邦集群方案7、Prometheus的四种数据类型7.1 C…...
类和对象(下)
类和对象(下)再谈构造函数构造函数体赋值初始化列表explicit关键字static成员静态成员的特性友元友元函数友元类成员函数做友元内部类匿名对象编译器的一些优化再谈构造函数 构造函数体赋值 在创建对象的时候编译器会调用构造函数给对象中的成员变量一…...
达梦数据库单机部署
一、安装前准备 1. 安装环境 操作系统:redhat7.9 达梦数据库版本:V8 内存:2G CPU:x86_64 2. 新建用户组和用户 groupadd dinstall useradd -g dinstall -m -d /home/dmdba -S /bin/bash dmdba passwd dmdba3. 配置参数 vi /etc/security/limits.conf #在末尾添加以下内…...
从零到一学习Flutter——(二)状态和路由
背景 前文提到了Widget的状态,在Flutter中一切都是Widget,那么由Widget组成的页面,会有很多复杂的父子关系,要想交互友好,则需要这些Widget进行通讯,也就是所谓的状态管理。 同时在了解了布局之后,我们会写出很多的页面,那么在这些页面切换,也是一个很重要的能力。 …...
TC358774XBG/TC358775XBG替代方案|CS5518替代TC358774XBG/TC358775XBG设计DSI转LVSD设计资料
TC358774XBG/TC358775XBG替代方案|CS5518替代TC358774XBG/TC358775XBG设计DSI转LVSD设计资料 TC358774XBG/TC358775XBG 芯片的主要功能是作为 DSI - LVDS 通信协议桥接,主芯片的视频数据可通过 DSI 链路流 出,以驱动兼容 LVDS 的显示板。换句话说&#x…...
Linux---Kernal与Shell讲解
目录 Shell简介 什么是Shell Shell分类 内核Kernal Shell简介 什么是Shell 我们首先需要知道一台完整的计算机是由硬件组成的,而人不可以直接与硬件交互,为了完成交互,进行了以下的操作 将硬件设备交由内核管理,给硬件套个内…...
Thiol-PEG-Acid,HS-PEG-COOH,巯基-聚乙二醇-羧基试剂供应
一:产品描述 1、名称 英文:HS-PEG-COOH,Thiol-PEG-Acid 中文:巯基-聚乙二醇-羧基 2、CAS编号:N/A 3、所属分类:Carboxylic acid PEG Thiol PEG 4、分子量:可定制,Thiol-聚乙二…...
做哪类网站没有版权问题/济南网络推广公司电话
一、写在前面的话 上一篇文章中,我们使用 Node.js 成功的实现了access_token 的获取、存储以及更新,这篇文章我们来实现微信的自定义菜单功能。 二、自定义微信菜单 1.微信文档步骤 在开始码代码之前,我们依然是先理清实现的思路…...
大型网站制作流程/搜索网页内容
接着上篇《编写高效Excel VBA代码的最佳实践(一)》 尽可能少使用“.”,使用对象变量 在前面已经介绍过的对长对象引用使用对象变量以及使用With…End With等都是简化”.”的方法。因为在代码中的每个句点都表示至少一个(而且可能是多个)过程调用,而这些过…...
网站建设制作一个网站的费用/如何写软文推广产品
字符串与字节数组的转换 String str "helloworld"; byte data[] str.getBytes(); for(int x 0 ; x < data.length ; x) { data[x]- 32 ; System.out.print(datd[x] ,); } System.out.println(new String(data)); 通过程序可以发现,字节并不适合处…...
深圳高端电商网站建设者/网页模板建站系统
第十九章 故障及问题管理670、故障是系统运行中出现的系统本身问题或任何非标准操作,已经引起或可能引起服务中断和服务质量下降的事件。671、故障处理彿发现故障时为尽快恢复系统IT服务而采取的技术上或管理上的办法。672、故障的特征:即影响度(故障影响…...
房地产网站建设方案书/如何推广自己的微信号
文章目录1 缩写 & 引用2 abstract & introduction & background3 FPGA accelerator design题目:A Real-Time Object Detection Accelerator with Compressed SSDLite on FPGA时间:2018会议:FPT研究机构:帝国理工学院 …...
宁波做网站烟台厂商/上热门最火标题
情景描述:之前使用的gitblit地址是:http://admin127.0.0.1:8080/gitblit/r/aaa.git,现在想修改为:http://admin127.0.0.1:8080/gitblit/r/bbb.git。解决方案:1、查看现用的remote地址:$ git remote -v orig…...