这里要介绍的是一堆特别的家伙,当然,这里是先打个照面,混脸熟,他们会在很多地方出现,有着特殊的含义,执行着特定的功能,这里就先叫他们”特殊字符“吧(注意在使用他们的时候不要使用中文输入法,要不会出现问题)
执行命令的顺序
1:分号,“;”
第一次接触他的场景或许是在多命令顺序执行的时候。比如说你现在刚登陆系统,你在家目录下,你想查看一下/etc某个目录下的内容,那么你需要cd,回车,如果层次深,那么你或许需要执行多次,最后ls一下。有了分号的帮助,那么就可以这么写
cd /;cd etc;cd XXX;ls
命令之间使用分号隔开,你设置好的命令便会依次执行。设想一下,你需要在你的Linux中搭建一个LAMP的web环境,在搭建环境的过程中你会有很多命令要执行,你如果一次的去执行他们,那么会花费你不少时间,因为完成当前命令执行完毕你需要键入下一个命令,有人值守的安装可是很痛苦的,如果这其中有了分号来帮助你实现命令的顺序执行,那么绝对会事半功倍。
但是,使用分号来顺序执行命令有一个缺点,那就是一旦其中某个命令出错,执行的过程不会停止,依旧向后继续执行。这一点并不好,如果命令不涉及改变环境变量,搭建某某运行环境还好,一旦出错,那么定位起来费时费力,所以分号最好使用在影响小的命令组合中。
2:逻辑与,”&&“
和一般编程语言中的逻辑与类似,他有着这样的格式”命令1&&命令2“,如果命令1执行没有出错,那么命令2才会执行,后续命令依次类推,但是只要有一个命令报错,便不会继续向后执行,执行过程停留在报错的命令上。这一个特性就比分号来得好,可以考虑使用它做一个通用的环境安装脚本。
3:逻辑或,”||“
这里需要注意一下,和常见编程语言中的逻辑或不太一样,编程语言中的逻辑或是”条件A或者条件B或者条件C等等条件N,这些条件中有一个满足,则整个表达式成立“,这里的逻辑或的含义是”命令A||命令B,命令A执行正确则不执行命令B,反之亦然“
*对于一个命令而言,如果能快速的得知是否执行正确?你可以试试
命令 && echo suc || echo fail
对于一个你指定的命令,如果他执行正确,那么逻辑与的echo suc便会执行,逻辑或便不会执行;倘若命令执行失败,那么逻辑与的echo suc便不会执行,这样一来,逻辑或的前半部分只有命令执行失败的结果,所以逻辑或的echo fail便会执行。
一些特殊字符会展开一些特殊内容
1:匹配任意内容,“*”
“*”在文件搜索的时候已经有所接触,是匹配任意字符的意思,但是那是限于文件搜索,如果我们使用echo命令来显示“*”呢?我们会发现,echo打印了当前目录下的所有内容,而没有打印“*”
再试试ls *
在含有“*”的命令中,shell会在执行前将“*”解析为匹配的内容,所以echo不认识“*”,没有打印他,ls 没有因为没有“*”这个目录而报错,进而正常显示了当前目录及其子目录下的所有内容。
2:家目录,“~”
之前提过,使用“cd”和“cd ~”作用相同,都是定位到当前用户的家目录,如果你在波浪线前面指定一个用户,那么会直接定位到该用户的家目录去,就像“cd ~duyt”。
3:算术表达式,$((表达式))
在表达式中可以填入整数运算的表达式,俨然一副计算器的样子,算术表达式支持加减乘除,取余(%),求幂(**)等操作,其中,加减乘除取余,不再赘述,运算符和一般编程语言的相同,都是“+-*/”,求幂则写为$((2**10)),这样便会输出2的10次方的结果。
4:花括号匹配,{}
这家伙和方括号“[]”有类似的地方,都能匹配括号里的内容,但是花括号更常见于这个场景:你需要新建一些文件,这些文件可能是你马上使用的日志文件,或者学习笔记,甚至是日记,他们的文件名有类似有不同,不同可能是顺序的日期或其他数字,那么花括号可以帮你完成这个工作。
touch 2015-01-{01..31},这样以来,会马上新建以顺序日期命名的文件,可以省去很多重复的工作。
删除的时候也可以使用花括号。
花括号包含以下几种形式
1:{X,X,X},匹配多个字符,使用逗号隔开。
2:{1..9},或者{A..Z}等其他类似的写法,这样写会匹配一个范围内的字符。
3:{{X,X},{X,X}},嵌套匹配,这样写法,是会产生四种匹配的
但是,花括号和方括号又有着不同,方括号重点在匹配上,而花括号重点在返回匹配的字符。
这是,编程的感觉吗?看看变量和引用
1:变量定义
好简单的,“变量名=变量值”,在shell中直接键入var=helloworld,那么你就有了一个var变量!
2:那么引用呢?
也好简单的,使用”$变量名”
3:引用一个命令的结果,“或者$()
比如:echo `ls`或者 echo $(ls),那么打印的将是当前目录的内容
当然了,演示的部分很简单,只是使用了ls命令,引用可以用在更多复杂的命令组合和场景中。
控制特殊字符的匹配
1:双引号
双引号可以用来控制参数个数,排除部分特殊字符的作用。就参数个数而言,当你使用echo打印一些字符
echo a b c d,那么echo会接受4个参数,打印之后,空格,制表符,换行符等把单词分割为不同参数的多余字符会被过滤掉。
当我们把含有分隔符号的参数使用双引号引起来,单词,或者说参数的分割就失效了,命令会把双引号内的内容作为一个参数来看待。
echo是如此,使用ls的时候,尤其是ls那些含有分隔符号的文件名的时候,双引号就能帮你大忙了。
但是在双引号中,shell的特殊字符,除了 $,\ (反斜杠),和 `(倒引号)之外, 将会失去它们的特殊含义,被当作普通字符来看待。这就意味着,刚才提到的参数分割,星号(*)匹配, 波浪线(家目录),和花括号匹配都将失效。参数引用,命令结果引用还有算术表达式仍然生效。
2:单引号,完全失效!
是的,单引号引起来的所有内容都会原样输出,所有特殊字符都会失效功能!
3:转义字符,反斜杠
有些时候,显示出个别特殊字符正式我们所需要的,这时候,反斜杠就可以帮到我们。就比如,过去我们常常听到“衬衫的价格是九磅十五便士”,那么货币单位就有可能需要转义,原样显示。当然了,美元符号才需要转义,英镑不需要。
不过要注意,某些组合是有特殊含义的
\t:按下tab键,这可是制表符
\r:回车符号
\n:新起一行
\b:退格键
目前,shell中一些任性的家伙我们已经有了一个初步的认识。