Linux Bash脚本编程语言中的美学与哲学(2)

  最常见的元字符就是空格。 从上面几张图片可以看出,如果要将一个含有空格的字符串赋值给一个变量,要么把这个字符串用双引号包围,要么使用“\”对空格进行引用。 从上图中可以看出,Bash中只有9个元字符,它们分别是“| & ( ) ; < > space tab”,而在其它编程语言中经常出现的元字符“. { } [ ]”以及作为数学运算的加减乘除,在Bash中都不是元字符。

三、字符串从哪里来、到哪里去

  介绍完字符串、介绍完引用和元字符,下一个目标就是来探讨这一个哲学问题:字符串从哪里来、到哪里去?通过该哲学问题的探讨,可以推导出Bash脚本语言的整个语法。字符串从哪里来?很显然,其中一个很直接的来源就是我们从键盘上敲上去的。除此之外,就是我前面提到的七八九种字符串展开的方法了。

  字符串展开的流程如下:

    1.先用元字符将一个字符串分割为多个子串;

    2.如果字符串是用来给变量赋值,则不管它是否被双引号包围,都认为它被双引号包围;

    3.如果字符串不被单引号和双引号包围,则进行大括号展开,即将{a,b}c展开为ab ac;

以上三个流程可以通过下图证明:

Linux Bash脚本编程语言中的美学与哲学

    4.如果字符串不被单引号或双引号包围,则进行波浪符展开,即将~/展开为用户的主目录,将~+/展开为当前工作目录(PWD),将~-/展开为上一个工作目录(OLDPWD);

    5.如果字符串不被单引号包围,则进行参数和变量展开;这一类的展开全都以“$”开头,这是整个Bash字符串展开中最复杂的,其中包括用户定义的变量,包括所有的环境变量,以上两种展开方式都是“$”后跟变量名,还包括位置变量“$1、 $2、 ...、 $9、 ... ”,其它特殊变量:“$@、 $*、 $#、 $-、 $!、 $0、 $?、 $_ ”,甚至还有数组:“${var[i]}”, 还可以在展开的过程中对字符串进行各种复杂的操作,如:“ ${parameter:-word}、 ${parameter:=word}、 ${parameter:+word}、 ;${parameter:?word}、 ${parameter:offset}、 ${parameter:offset:length}、 ${!prefix*}、 ${!prefix@}、 ${name[@]}、 ${!name[*]}、 ${#parameter}、 ${parameter#word}、 ${parameter##word}、 ${parameter%word}、 ${parameter%%word}、 ${parameter/pattern/string}、 ${parameter^pattern}、 ${parameter^^pattern}、 ${parameter,pattern}、 ${parameter,,pattern}”;

    6.如果字符串不被单引号包围,则进行命令替换;命令替换有两种格式,一种是$(...),一种是`...`;也就是将命令的输出作为字符串的内容;

    7.如果字符串不被单引号包围,则进行算术展开;算术展开的格式为$((...));

    8.如果字符串不被单引号或双引号包围,则进行单词分割;

    9.如果字符串不被单引号或双引号包围,则进行文件路径展开;

    10.以上流程全部完成后,最后去掉字符串外面的引号(如果有的话)。以上流程只按以上顺序进行一遍。比如不会在变量展开后再进行大括号展开,更不会在第10步去除引用后执行前面的任何一步。如果需要将流程再走一遍,请使用eval。

  探讨完了字符串从哪里来,下面来看看字符串到哪里去。也就是怎么使用这些字符串。使用字符串有以下几种方式:

    1.把它当命令执行;这是Bash中的最根本的用法,毕竟Shell的存在就是为了粘合各种命令。如果一个字符串出现在本该命令出现的地方(比如一行的开头,或者关键字then、do等的后面),它将会被当成命令执行,如果它不是个合法的命令,就会报错;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8cabaa9b69cf1aca17290f181b262456.html