Linux之Shell脚本自动化编程四(命令排序,元字符,echo实现彩色输出和printf)

 

命令排序

 

命令排序方式也就只有;,&&和||。;没有逻辑判断的功能,它也就是能允许同时执行两条命令。以前我们曾经讲过&&和||的逻辑,说过把&&看成是或,||看成与,但是其实我们还有更好的理解方式,也就是按照负逻辑去理解,负逻辑就是true为0,false为1。

 

或者我们直接按照命令执行的结果来看,没有任何问题的话,就是true,反之,就是false,不看命令返回值也可以理解。

 

;连接的时候前一个命令执行过程中有没有问题,后一个命令照样可以执行,不过前一个命令可能影响后一条命令的结果。截至目前,我们学过了三种命令中带有&,命令最后的&的意思 是后台运行的意思,&>是混合输出重定向,&&是逻辑与,注意区别。

元字符

下面的[]的含义和正则表达式的意思是一样的,但是其他符号的意思都不一样。

 

我们稍微复习一下正则:

 

()在正则表达式里面是子组的意思。注意[]里面的字符只能匹配一个。

 

正则表达式里面的^除了在[]里面开头是非的意思,在正则匹配模式开头的话就是以什么什么开头的意思,在bash shell里面至少ls和find是没有的,有的命令的参数是不支持正则表达式模式的,

 

我们上面有一个umask我们还没有见过,先学习一下,参考了https://www.cnblogs.com/zhangchengxiang/p/5196439.html

 

 

 

默认的是0022,前面其实也说过文件一般不会轻易给执行权限,所以文件最多是666,这里我们是不用考虑高级权限,setuid,setgid,t那些东西的,上面我用getfacl已经看过了,然后用666-022得到的是644,也就是rw-r--r--,目录呢,是可以有执行权限的,所以最多是777,然后减去022,就是755,也就是rwxr-xr-x。后来我们改为了002,按照上面的进行分析,文件应该是rw-rw-r--,目录就是都多一个x,rwxrwxr-x。如果我创建一个不同于当前umask的文件,而又不改变当前shell的umask,那么我可以在子shell里面完成umask的改变和文件的创建。

 

大括号集合以前我们也见过了,这里主要说的是命令的简化。比如我想把1复制一份,并且命名为1.old。我就可以像下面这么写,-v是为了显示一下复制的过程。

 

这里还是说一个\,\主要有两个作用,一是让元字符回归本真,也就是说让*仅仅打印一个星号而不是作为通配符,二是生成转义字符,比如\t是一个制表符,\n是换行等。让元字符回归本真还可以用引号。我们上面echo *,是打出了当前目录下的所有文件,并不是打印*,那么如何打印*呢?我们可以echo \*,也可以echo '*'或者echo "*"。echo 加-e还要加引号才能解释转义字符。看到我们上面还打了一个echo \ *,中间加了一个空格是什么意思呢?空格在这里面其实也算是元字符,是参数分隔符,那么\空格就可以让空格的含义回归空格,echo \ *打印的结果是*前面有一个空格,但是如果加两个空格呢?也就是echo \  *呢?第一个空格和前面的\,打印的是一个空格,第二个空格是分隔符,后面的*是第二个参数。所以打印的是一个空格,后面是当前目录下的所有文件。

 

想打印两个空格就需要两个\,三个就需要三个。上面touch 12 23和touch 11\ 22的含义有什么不一样吗?结果显而易见不一样。

 

\还被用作一个命令如果太长,可以两行写,这两行之间的连接符就是\,这个其实也是\把回车的含义给返璞归真了,回车原来的意思就是执行命令,现在加一个\,就把回车的特殊含义给去掉了,回车也就变成了换行,不过我们用echo举的例子打印出来是不换行的,因为这是相当于一条命令分行写了而已。

 

echo实现彩色输出

还参考了https://www.bilibili.com/video/av11556463/?p=6,第14分钟开始。

 

echo颜色输出时格式为echo -e "\033[属性代码;背景色;文本颜色m输出的文本",其中\033可以用\e代替。

 

一般会在最后加上\e[0m,因为这是将颜色复位的。

 

用dircolors -p也可以看一这些数字的含义。

 

这个-e和引号是必须要加的。

 

我们就不用\033了,显然\e方便一点。

 

只有\033的效果才和\e一样,虽然不知道为什么,属性代号,前景色和背景色三个数字之间必须用;隔开,这三个数字的位置可以随便换,不过如果在最后加一个0,前面的就都没有效果了。一般我们都会在最后加\e[0m恢复一下颜色,不加的话,颜色会一直是前面设定的颜色。m后面直接就是字符串,不需要加空格,如果你加了,打印出来前面也有空格。

 

m不知道什么意思,但是这个确实必须要有的,如果有超出上面范围的数字,都会按照默认来处理。

 

并且如果你想打印两段不同格式的文本,前一段设置的会延续到下一段,除非你\e[0m或者直接重新设定一次覆盖掉。

 

printf

printf学过c语言的朋友一定不陌生了。当然因为linux内核就是c语言写的,我们也不必大惊小怪。printf和echo比好处就是格式化输出。参考了http://man.linuxde.net/printf

 

 

 

printf格式是printf "格式"后面是要输出的文本,用空格隔开,引号和文本之间也得有空格。

 

如果后面没有参数,%d,%o格式输出的默认是0,%s的就是空字符。

 

这一讲先到这里,最近有点怠惰了,更新太慢,我检讨。

猜你喜欢

转载自blog.csdn.net/qq_41740705/article/details/81604508
今日推荐