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

一些基础知识

 

 

 

 

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

shell变量

 

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

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

 

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

 

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

 

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

 

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

 

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

 

 

 

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

 

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

 

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

 

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

 

 

 

 

 

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

 

 

 

 

 

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

 

 

 

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

 

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

 

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

 

 

 

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

 

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

 

但是@就没有。

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

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

 

 

 

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

 

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

字符串的相关操作

 

 

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

 

 

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

 

${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]结果为什么不一样相信大家也都会分析了。

 

 

 

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

数组

 

 

 

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

 

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

 

SHELL的注释

 

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

 

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

 

Read

 

 

 

 

 

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

Linux中的各种括号

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

 

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

 

 

 

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

 

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

 

 

 

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

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

 

 

 

 

 

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

 

 

 

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

 

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

 

 

 

 

 

 

 

 

 

 

 

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

 

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

 

 

 

 

 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值