前言
脚本语言非常重要,尤其是在编译的时候,因为之前都是搞的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,如有侵权,请联系删除。
网友评论