美文网首页Android开发教程
音视频学习之路--Shell脚本基础

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

作者: 蜗牛是不是牛 | 来源:发表于2021-12-01 16:47 被阅读0次

    前言

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

    正文

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

    Hello World

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

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

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

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

    变量

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

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

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

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

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

    使用变量

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

    只读变量

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

    删除变量

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

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

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

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

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

    字符串

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

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

    单引号

    比如下面代码:

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

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

    双引号

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

    打印如下:

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

    字符串常用API

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

    这里分别是 # 来获取字符串的长度,: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为执行脚本的第二个参数,n,其中n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,0为执行的文件名,比如下面代码:

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

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

    数组

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

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

    运算符

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

    • 算数运算符
    • 关系运算符
    • 布尔运算符
    • 字符串运算符
    • 文件测试运算符

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

    算数运算符

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

    输出是:

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

    • 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,也就是 != 的意思

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

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

    逻辑运算符

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

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

    字符串运算符

    为什么这里要有字符串运算符呢 说白了就是因为字符串在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
    
    
    

    打印如下:

    test命令

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

    打印如下:

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

    流程控制

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

    if格式

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

    for循环

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

    while循环

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

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

    总结

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

    相关推荐
    Android音视频开发:音视频基础知识到直播推流实战系列教程_哔哩哔哩_bilibili

    本文转自 https://juejin.cn/post/7024420432325378062,如有侵权,请联系删除。

    相关文章

      网友评论

        本文标题:音视频学习之路--Shell脚本基础

        本文链接:https://www.haomeiwen.com/subject/rqedxrtx.html