阅读 91

音视频学习之路--Shell脚本基础

前言

脚本语言非常重要,尤其是在编译的时候,因为之前都是搞的Android应用层开发,很少搞shell脚本这种,顶多就是gradle脚本的编写,这方面比较薄弱,所以这里重点学习一下Shell脚本。

正文

首先Shell是一个程序,它是用C语言编写的,通过Shell可以更好的使用Linux。

Hello World

还是从Hello World开始,vim 创建一个test.sh,在里面写入:

image.png

然后保存,再给这个shell文件添加执行的权限,直接777拉满,再直接./运行这个文件:

image.png

这里的执行是不是很熟悉,直接使用 ./ 来运行,因为这也是运行C/C++编译出来的可执行文件一样,是一个可执行文件。

看一下脚本内容,其中#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令用于想窗口输出文本。

变量

定义变量时,就直接变量名加等于号即可,不用使用$符号。变量的命令规则和普通的编程语言类似,也就是数字、字母和下划线,但是不能以数字开头,不能是bash里的关键字(可以用help命令查看),但是有个非常反人类的点就是等于号=2边不能有空格:

image.png

比如这里的 = 2边就不能有空格,否则无法执行。

除了显示的直接赋值,还可以使用语句给变量赋值:

image.png

比如上面的代码,执行结果是:

image.png

注意上面变量文件的代码,有个关键点就是 $ 符号后的代码,那个点是按键1旁边的,不是单引号。

使用变量

这里使用变量就和kotlin语言一样了,使用美元符号来获取值,同时来获取值,同时符号后面可以跟花括号,来识别变量的边界,比如下面代码:

image.png

只读变量

类似于很多编程语言,Shell中的变量也是区分只读变量的,只读变量就是不能修改的变量,使用readonly来修饰变量即可:

image.png

image.png

删除变量

删除变量这个很有意思,在之前的编程语言中都没有这个概念,删除变量的意思是删除后,这个变量将不能再次使用,这啥意思呢,比如下面代码:

image.png

这里 我定义了一个变量,然后把这个变量删除,再来取出这个变量的值,按常理来说这个就是空,所以预期也是,没有任何打印:

image.png

那我再给这个变量赋值呢,它嫩不能变回来:

image.png

发现是可以的,所以这个删除变量的意思就和kotlin中吧一个变量置空一样,

image.png

当然对于只读变量是无法进行删除操作的。

字符串

字符串这个在Shell中用的非常频繁了,但是在Shell中字符串定义起来非常随意,可以是单引号、双引号也可以不带引号,这也是一个字符串。

虽然定义随意,但是在使用时可就要注意了,这里还是简单说一下。

单引号

比如下面代码:

image.png

按理说这里的输出是一个拼接后的字符串,但是打印是:

image.png

这里就不对了,这也是单引号字符串的限制,单引号字符串无论怎么样,都会原样输出,在字符串中定义的变量是无效的。

双引号

那双引号字符串会不会出现这种情况呢,直接看代码:

image.png

打印如下:

image.png

看到这里我们就明白了,如果想能拼接字符串还是得用双引号,同时对于转义字符也必须使用双引号。

字符串常用API

字符串的API没多少,这里就简单说几个比较常见的,

image.png

这里分别是 # 来获取字符串的长度,:1:4是用来截取字符串,expr index xxx 3是查询字符3出现的位置,前面2个都好理解,最后一个expr其实这个是Linux中的一个命令,注意如果echo一个Linux命令执行结果使用2个点来获取值,这里简单说一下这个expr指令。

expr命令是一个手工命令行计数器,应用于在Linux下求表达式的值,一般用于整数值,也可以用于字符串,语法是:

expr 表达式复制代码
  • 计算字符串长度

expr length "this is test复制代码
  • 抓取字符串

expr substr "this is a test" 3 5复制代码
  • 抓取第一个字符出现的位置

expr index "ascd" c复制代码
  • 整数运算

expr 19 % 9复制代码

传递参数

这个就比较重要了,比如我执行这个脚本我肯定需要传递进来的参数,比如对手动输入的变量、或者文件夹进行处理,但是在脚本内获取参数格式为n,其中n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,n,其中n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,nn120为执行的文件名,比如下面代码:

image.png

然后在执行文件时,传入参数:

image.png

这里能获取到我们传入的参数,其中美元符号$n这里会不会获取到我们定义的变量呢,肯定不会,因为变量名不能以数字开头,也不能是纯数字。

数组

说了字符串,肯定要说一下数组了,其实在Bash Shell中也没必要有什么其他的数据类型,字符串和数组就基本搞定了所有,其中Bash Shell只支持一维数组,使用括号来表示,元素用空格分隔开,也非常简单,

image.png

上面代码也就是通过[]获取数组固定index的值,* 表示所有数组值,获取长度一样是使用#,上面打印结果:

image.png

运算符

这个部分就是重点了,Shell和其他语言一样,支持多种运算符,包括:

  • 算数运算符

  • 关系运算符

  • 布尔运算符

  • 字符串运算符

  • 文件测试运算符

这个里有个点需要注意,就是bash不支持简单的数学运算,那数学运算怎么搞呢 其实前面说过了,可以使用expr命令来实现。

算数运算符

这里说了使用expr来求值,表达式需要用2个点来包含,但是注意一点就是表达式和运算符直接必须要有空格,但是对于赋值来说不能有空格,对于相等和不相等运算符来说括号不能少,直接看代码:

image.png

输出是:

image.png

这里的看似简单,其实很容易写错,下面总结一下:

  • a=10 赋值运算符不能有空格

  • expr求值表达式要用··来包裹,不需要$

  • expr中的表达式必须要有空格来隔开

  • 乘号需要反斜杠

  • if后面判断语句使用[]中括号

  • 中括号中的2个判断对象,在中括号前后都必须有空格,也就是[a==a ==a==b]是错误的

关系运算符

上面算数运算符肯定少了点东西,最简单的就是不能处理字符串,而且不能判断哪个大哪个小,所以就有了关系运算符,下面简单说一下关系运算符:

  • gt:great than,也就是 > 的意思

  • lt: less than,也就是 < 的意思

  • ge: great equal,也就是 >= 的意思

  • le: less equeal,也就是 <= 的意思

  • eq: equal,也就是 == 的意思

  • nq: not equeal,也就是 != 的意思

既然了解了上面的各种缩写,那就再看个简单例子:

image.png

这里为了打印更清晰,特定给Linux安装了一个中文输入法,可以输入中文了,其实了解了上面几个英语缩写,这几个运算符就很容易,打印如下:

image.png

逻辑运算符

逻辑运算符其实就俩个,分别是AND和OR,也就是&&和||,但是呢 在Shell脚本中使用就比较特殊了,有逻辑运算符的判断区域必须使用[[]]而不是使用[],在前面我们if后面跟的判断区域都是用[]给括起来,但是对于逻辑运算符就不一样了,要使用[[]]才可以,下面简单看个例子:

image.png

这里的括号是双重括号,打印如下:

image.png

字符串运算符

为什么这里要有字符串运算符呢 说白了就是因为字符串在Shell中太常用了,这里搞几个字符串运算符是为了方便处理和判断,也就下面几个:

  • =: 检测2个字符串是否相等

  • !=: 检测2个字符串是否不相等

  • -z: 检测长度是否为0

  • -n:检测长度是否不为0

  • $:检测字符串是否为不

文件测试运算符

这个很有必要,因为脚本经常要去读文件,判断文件的属性,下面看个例子来说明几个常用的:

file="/home/zyh/Desktop/test/file.sh"

if [ -r $file ]
then
	echo "文件可读"
else
	echo "文件不可读"
fi

if [ -w $file ]
then
	echo "文件可写"
else
	echo "文件不可写"
fi

if [ -x $file ]
then
	echo "文件可以执行"
else
	echo "文件不可以执行"
fi

if [ -d $file ]
then
	echo "文件是目录"
else
	echo "文件不是目录"
fi

if [ -s $file ]
then
	echo "文件不为空"
else
	echo "文件为空"
fi

if [ -e $file ]
then
	echo "文件存在"
else
	echo "文件不存在"
fi复制代码

打印如下:

image.png

test命令

这个是啥意思呢 其实就是用于检查某个条件是否成立,和if语句很像,感觉就是if语句的变种,变得更容易读了,直接看几个例子即可:

image.png

打印如下:

image.png

可以看见这里就是把if后面的[]给简化了。

流程控制

和其他所有语言一样,流程控制是必不可少的,但是在Shell脚本中是不存在花括号来代表代码块,是使用then 和 else,下面来简单梳理一下。

if格式

if的区别就是条件成功用then,还要用fi结束,这个在之前例子很多。

for循环

这个比较特殊,执行代码块使用do和done包裹,遍历的话是for和in倒是和其他编程语言一样,看个例子:

image.png

while循环

这个和for循环一样,执行代码块也是用do和done包裹,看例子:

image.png

注意这里的if使用[]来包裹判断条件,但是while必须使用(),所以这里要使用双层括号。

总结

Shell脚本还有很多,这里只是一些基础,后面遇到具体脚本再做分析。


作者:元浩875
链接:https://juejin.cn/post/7024420432325378062


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐