Linux shell 学习
0赞在学习uboot的makefile的时候,发现有很多东西看不懂,因为包含了很多linux shell的一些知识,本着什么不会,就学什么,所以先来学习一下linux shell。
参考的是网易云课堂的北大青鸟的linux shell视频教程。
1、Shell命令的组合使用
三种
&&逻辑与
使用:
命令1 &&命令2
当命令1执行成功后,再执行命令2,如果命令1执行不成功,那么命令2不执行
第一个,cd命令执行成功,所以echo命令也执行,有输出
第二个,cd命令执行不成功,所以echo命令不执行,没有输出
||逻辑或
使用:
命令1 ||命令2
当命令1执行成功勾,不执行命令2,只有命令1执行不成功,才执行命令2
第一个,cd命令执行成功,所以echo命令不执行,没有输出
第二个,cd命令执行不成功,所以echo命令执行,有输出
;顺序执行
使用:
命令1;命令2;…..;命令n
按照顺序,依次执行命令1,命令2,…..命令n
首先执行cd命令,然后再执行pwd命令。
2、使用变量
Shell和其他语言一样,可以使用变量,不过变量是没有类型的。而且使用的时候,需要在前面加$符号。即$变量,也可以用${变量}来引用这个变量。
var = “hello world”(申明变量,注意等号两边不能有空格,不然会把var认为是命令)
使用var变量的话,就要用$var,或者是${var}
第一个设定var变量,值为字符串hello world。
第二个使用echo打印变量的值。
第三个也是使用echo打印变量的值
下面两个地方要注意:
双引号:
使用双引号的字符串,是允许引用以及\转义的
单引号:
使用单引号的字符串,不允许禁止使用,\转义的
第一个是在””中引用变量,变量会替换的
第二个是在’’中引用变量,这个时候变量是不会替换的。
反撇号,或者$():
以命令输出进行替换
第一个使用反撇号`命令`,命令的输出就会赋值给var变量
第二个使用$(命令),命令的输出也会赋值给var变量
有以下几个变量比较特殊:
$?:前一条命令执行状态值,0表示正常执行,非0表示执行异常
$0:脚本自身程序
$1-$9:执行脚本输入的第一个到第九个位置参数
$*:命令行的所有位置参数的内容
$#:命令行的位置参数个数
Bash代码,测试特殊的几个变量
执行,代码就可以看到结果。
$0表示执行的命令
$1和$2表示输入的第一个和第二个参数
$#表示输入的参数个数,这里是有2个
$*表示输入的参数的内容,这里有两个参数,所以内容就是hello world
3、数值运算及处理
使用expr命令,计算表达式
格式:
expr数值1操作符数值2
操作符包括+-*/%,和其他语言是一样的。但是要注意的是,使用*的时候,要使用转义字符,即\*
使用也比较简单,就是注意*要有转义,不然就会报错
使用$[],进行算数替换
$[数值1操作符数值2]
操作符包括+-*/%,和其他语言是一样的。这里,*是不要转义的。
可以使用let让变量自加和自减
格式:
let变量++let变量--let变量+=n
也比较简单,和c语言的运算简写赋值一样
产生随机数,使用RANDOM变量
第一个产生一个随机数,范围是0 – 32767
第二个产生一个100以内的随机数
生成数字序列
使用seq生成数据序列
格式
seq首数末数或seq首数增量末数
没有首数的话,默认是从1开始的。
第一个产生从1开始到5的序列
第二个产生从3开始,增量是2,末数不超过10的序列
第三个产生从3到5,以1为增量的序列
小数运算
通过管道,使用bc命令
不过小数处理在bash里面,应该用得比较少的。
4、字符串处理
路径分割
当需要把路径和文件分割开,可以使用dirname命令和basename命令
这样,就可以得到路径和文件名
字符串截取
使用expr命令
exprsubstr变量起始位置截取位置
编号从1开始,这个要注意
使用${}表达式
${变量:起始位置:截取长度}
编号从0开始
5、条件测试
[条件表达式]
检测/etc是否是一个目录,是的话打印YES
对于[]要注意,在每个组件之间都要有空格
-d:是否为目录
-f:是否为文件
-e:目标是否存在
-r:是否有读取权限
-w:是否有写权限
-x:是否有执行权限
还可以判断变量是否存在
如果变量sasda不存在,那么”${sadsa}”就为空,-z是为空判断,那么第一个测试通过,所以第二个命令不执行
如果变量sadsa存在,那么”${sadsa}”就不为空,第一个测试不通过,所以就要执行第二个命令。
整数值比较,有以下操作符
-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-ge:大于或等于
-le:小于或等于
第一个测试通过,所以命令2执行
第二个测试不通过,所以命令2不执行
字符串匹配
使用=和!=
6、使用if判断语句
单分支if语句结构
if条件测试
then命令序列
fi(表示条件判断结束)
双分支if语句结构
if条件测试
then命令序列1
else命令序列2
fi
多分支if结构
if条件测试
then命令序列1
elif条件测试2
then命令序列2
。。。
else
命令序列n
fi
7、使用for循环
语法
for变量名in取值列表
do
命令序列
done
8、使用case分支
Case变量值in
模式1)
命令序列1
模式2)
命令序列2
。。。。。。
*)
默认命令序列
esac