Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)

一些基础知识

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第1张图片

 

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第2张图片

 

最常用的还是我们的bash。今天我们主要学习一下shell变量。

shell变量

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第3张图片

 

首先先来了解一下shell变量的命名规则,参考了http://www.runoob.com/linux/linux-shell-variable.html

和c语言是一样的,因为linux内核就是c写的嘛。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第4张图片

 

保留的关键字还是蛮多的。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第5张图片

 

以前我们赋值用了let,其实不需要用的。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第6张图片

 

变量名和等号之间,等号和值之间都不能有空格,不然会报错。不过文件名的条件就比较宽松了。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第7张图片

 

下面具体认识一下环境变量和局部变量。参考了https://blog.csdn.net/apollon_krj/article/details/70148022

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第8张图片

 

env看一下环境变量还是挺多的。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第9张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第10张图片

 

unset的取消是一次性的,看到unset以后,~也变成了root了,因为以前root的HOME变量就是root的家/root,但是现在HOME变量已经没有了。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第11张图片

 

我们可以再人为给HOME赋值回去,然后发现~又回来了。当然我们还可以赋别的值,不过这些都是暂时的,再开一个会话就会恢复正常了,因为这些更改都没有改变配置文件的内容。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第12张图片

 

在配置文件里面改动的话,我们就在/etc/bashrc里面改动吧。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第13张图片

 

看到新开的已经是更新了,不过当前shell里面需要.或者source执行一下。一次性定义环境变量有如下方法。不过都是一次性的。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第14张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第15张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第16张图片

 

如果在shell里赋值而不不加export,不会出现在env命令(environment)打印出来的环境变量中。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第17张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第18张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第19张图片

 

确实awk命令里面正好和echo里面是反过来的,而且awk里面单引号即使用反斜杠转义还是打不出来$a。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第20张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第21张图片

 

如果不加大括号没有解析的原因应该是没有cmd_kang变量,这个其实不是歧义,这个解析的时候应该是遇到非法字符才会停止,可以说是一种贪婪解析,解析不成功的话,命令还是会执行,但是会直接放弃不能解析的字符,所以结果是code_.tar.gz,中间没有解析成的$cmd_kang直接丢弃或者说因为没有这个变量所以是空的。tar命令这里复习了一下,c是打包,f是执行文件路径,z是压缩格式是gz。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第22张图片

 

给cmd_kang赋值以后可以解析成功,不过我们其实只是想解析cmd而已,那么我们加一个大括号即可。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第23张图片

 

小括号不行,因为以前其实有过小括号是在子shell里面执行命令,里面必须是命令,中括号也不行,中括号是字符匹配用的,所以用了大括号。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第24张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第25张图片

 

下面看到的特殊变量在env是没有的,所以不算是环境变量。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第26张图片

 

不过在/etc/bashrc里面有*。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第27张图片

 

但是@就没有。

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第28张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第29张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第30张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第31张图片

 

脚本后面跟了三个用空格隔开的参数,$#就是3,$1,$2分别就是后面跟着的第一个和第二个参数。上面暂时看不出来$*和$@的区别。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第32张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第33张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第34张图片

 

上面$?在脚本里的应用可能暂时看不懂,后面学习if之后就开可以看懂了。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第35张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第36张图片

 

这里只读变量最好不要轻易设定,因为在当前会话里面已经该不回去了,好在这样定义变量是一次性的,重启之后或者重开一个会话变量就没了,我们在写脚本的时候设置一个了一个只读变量想该回去也很简单,只需要把脚本里的readonly删掉,然后重新加载一遍配置文件就好了。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第37张图片

 

shell变量还可以是字符串,前面其实也有过。

字符串的相关操作

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第38张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第39张图片

 

echo是shell内置命令,awk不是,这或许就是单双引号有差异的原因了。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第40张图片

 

其实我们我们可以不用引号,只要在需要有空格或者打印一些元字符的时候可以用到引号或者反斜杠。在单引号里双引号被视为一般的字符,在双引号里单引号也是一样,但是在单引号里再写单引号,必须配对,双引号里再写双引号,要么反斜杠,要么配对。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第41张图片

 

其实字符串拼接也不一定要用引号,不过!用双引号好像打不出来,用单引号可以打出来叹号。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第42张图片

 

单引号里面应该即使有变量也不会替换才对,但是我们看到了两对单引号里面还是替换了。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第43张图片

 

单引号有点意思,2个单引号好像就相当于一个双引号,所以偶数对单引号里面的变量可以替换。expr是个不错的命令,可以用正则表达式匹配查找字符串,还可以看字符串的长度。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第44张图片

 

${#string}可以求string的长度,这个花括号一定要加,不然的话先执行了$#,就是0,然后a是单独的。这个字符串分片中第二个冒号的作用和python是一样的,不过没有负向索引。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第45张图片

 

expr index string 要匹配的字符串可以返回匹配到的字符串的第一个字符的下标,注意expr命令这里面下标是从1开始的,如果返回0,就是没匹配到。expr length string可以打印字符串的长度,expr string : 正则表达式匹配模式,不过这个正则和python里面的还不太一样,今天我们就先不要深究了。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第46张图片

 

还有一个比较有用的是字符串截取。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第47张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第48张图片

 

这个星号必不可少,它的位置代替了被删除的字符,比如说#是删除左边的字符,那么*的位置就在//左边,要删除右边的*的位置就在/右边。前面我其实误解了${a:0:2}第二个冒号的意思,和python里面的并不一样。第二个冒号后面的参数是字符个数而不是最后的字符下标。而python里面是切片的最后一个字符串的索引+1,因为不包含右边。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第49张图片

 

${a:0:2}和a[0:2]的结果一样是因为${a:0:2}从0号字符开始,一共两个字符,那么ab就完事了。

a[0:2]是从0号字符开始到2-1=1号字符结束,不包含2号字符,这就是恰好一样的原因。那么${a:1:2}和a[1:2]结果为什么不一样相信大家也都会分析了。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第50张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第51张图片

 

不过无论起始点在左边还是右边,bash里面总是从左向右截取的,python里面可以把步长设为负的,从右向左截取。

数组

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第52张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第53张图片

 

用${a[*]}也可以打印所有元素。我们看到echo $a是打印了a的0号元素,这让我回想起当时学c语言的数组的时候,a这个数组名指向的是a的第一个元素,a就是a中元素的首地址,这里应该也是这个原因了。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第54张图片

 

bash里面必须要用小括号,中间空格分隔的才是不同的元素,逗号不是分隔符,只是一个字符串而已。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第55张图片

 

SHELL的注释

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第56张图片

 

我们就先不试函数的那种多行注释的方法了。来试试下面的。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第57张图片

 

看到确实ls和ps aux都没有执行,也就是被作为注释了。这个冒号其实也可以做注释符,不过后面需要加一个空格才可以。关于冒号,参考了https://blog.csdn.net/kankan_summer/article/details/8236475#t0

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第58张图片

 

Read

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第59张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第60张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第61张图片

 

要想加一些提示语句,就必须要有-p。看到各种括号是不是已经头晕脑胀了呢?$[a+b]又是什么意思呢?下面我们就来总结一下各种括号。

Linux中的各种括号

参考了https://blog.csdn.net/AhhSong/article/details/76650391

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第62张图片

 

上面四条我们前面都使用过也演示过。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第63张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第64张图片

 

目前也就是双小括号或者expr可以进行一些运算了,当然[]也可以。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第65张图片

 

这个进制转换前面的16是原来的进制,后面的5f是原来十六进制数,5f=5*16+5=95。8#70就是7*8+0=56。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第66张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第67张图片

 

关于表达式和文件测试,参考了https://www.cnblogs.com/china1/p/5935999.html。这里重复一个很重要的点,bash里面是负逻辑不是正逻辑,负逻辑就是真为0,假为1。

op就是operation,运算符的意思。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第68张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第69张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第70张图片

 

上面其实也写有,字符串判断相等可以用=,不过更普遍的还是==。用[]判断的话,左右必须有一个空格,操作数和运算符之间也必须有空格,得到的结果才是对的,可以看一看上图红色箭头指向的两行。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第71张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第72张图片

 

还可以加上一条,[]里面可以进行运算,不过必须和$搭配使用,中间的一些空格也不用加,并且返回的结果是正逻辑的。需要加空格的,不加$的这种是负逻辑。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第73张图片

 

整数比较还是用-eq,-ne这种才是正确的。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第74张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第75张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第76张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第77张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第78张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第79张图片

 

这里稍微举一个例子,这里是对上面学习的一个补充。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第80张图片

 

由于?只能代表一个字符,*可以代表很多个字符(肯定不是任意多,我记得在学python的时候说过,好像是2千万多个?),所以会出现上面的差异,而且确实不改变原来的字符串。

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第81张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第82张图片

 

 

Linux之shell脚本自动化编程五(shell变量详解和各种括号的作用)_第83张图片

 

那么今天就先先到这里吧。

你可能感兴趣的:(linux)