习惯c语言的同志们,写linux script 的时候请注意小细节
1, 流程控制语句的条件判断部分方括号后面:请加空格
例如
if空格[空格$aa lt num空格]
then
code segment
else
code segment
fi
2,关于shell解释器
有时候shell解释器会引起麻烦(这种麻烦来自于有时你并不想让shell解释一些字符)
先说一下metacharachter(元字符):一个含有多重意义的字符被称为元字符,这种字符通常不仅仅包含其自身的字面意思。bash shell有自己的一套metacharachter,并有相应的解释机制。正则表达式系统也有自己的元字符和相应的解释机制,通 常,这些元字符标准是一致的,但是不排除不一致的情况。
bash grep要求在匹配时给出一个pattern,如果此pattern是一个正则表达式,则有可能携带有shell 的metacharacter。
这里情况就变得比较复杂,下面分类:
1,如果该字符是shell metacharachter,同时,在正则表达式里面有其特殊含义,then:
首先记得用strong quoting把这个pattern括起来以防止shell试图对其进行解释而得到不希望得到的结果,其次正确的利用正则表达式本身的机制表达你想要得到的结果(转义,反义,锚定,重复,模糊匹配等等烂七八糟的东西)
2,如果该字符不是shell metacharacter,但是正则表达式的元字符,括不括就随你的便了,但是注意正确表达正则表达式
3,如果该字符是shell metacharachter,而不是正则表达式的元字符,请你把它括起来防止shell解释器解释。
关于以上说法最明显的例子是grep 匹配\字符的情况,正确的写法是:
grep '\\' sourcefile
如果写成 grep \\ 或者grep "\\"
shell会提示:grep:末尾的斜杠,这说明shell解释器对pattern进行了解释,并把解释后的结果(这里是\)递给了grep,grep接到参数后认为这是一个元字符(逃逸字符)并且没有被转义,是非法的,所以会报错。
如果写成grep '\'
shell同样提示:grep:末尾的斜杠,这是因为shell虽然不解释\,但是参数\传给grep以后仍然认为这是一个元字符。
若果写成 grep \ sourcefile
bash shell会停止响应,猜测是因为bash不知道你要grep什么东西了
要说明的是:
强弱quoting的区别在于:
弱quoting(一对双引号)里面的$,\等少数几个字符仍然被shell解释,其余metacharachter不被解释
强quoting(一对单引号)里面的元字符均不被解释,包括$,\在内。
这里写一个匹配的小例子:
human<tab>sfuhojhfa<tab>human
human<tab>dlfuil;djsfikdsf<tab>mouse
rat<tab>ldfkuaselkt;lkfg<tab>human
对于以上文本,要找出两个human中间加一段字符串的行,可以这么写:
human.*human
以上是我对shell grep的理解,有错误还请斧正