shell脚本给运维工作带了很大的方便,但其中也有一些怪异的语法规则,总是容易给人挖坑。
- 对空格的使用
- 在if else语法中,if与后面的表达式必须有空格隔开,这对于熟悉其他语言的程序员来说很容易将其忽略,导致面对语法错误的提示百思不得其解。
-
if [ expression ] then Statement(s) to be executed if expression is true fi
- 在表达多个元素时,元素之间是采用空格个来分隔,比如定义数组时:
- array_name=(value0 value1 value2 value3)
- 又比如作为函数参数时:
- printf "%d %s\n" 1 "abc"。
- 为什么不能使用逗号呢?来对比一下看看哪种看起来更舒服:
- array_name=(value0,value1,value2,value3),
- printf "%d %s\n",1,"abc
- 另一个更怪异的地方是,在定义变量时,变量名和等号之间不能有空格,这也太奇葩了!
- myNum =10 (错误)
- shell中另一个怪异的地方是做同样一件事可以有好几种表达方式:
- 比如变量引用,可以是$myvar,也可以是${myvar},从避免代码看起来混乱的角度看,应该强制使用大括号将变量与其他字符进行分隔比较合理。可以对比下下面两种情况,哪一种看起来更舒服,更容易区分哪里是变量哪里是字符串字面量。
- echo "there is "$num1" person and "$num2" room"
- echo "there is ${num1} person and ${num2} room"
- 比如循环,可以用for,也可以用while,还有until,实际上until用处并不大,一般都能用while代替掉,为了一个很少用到的情况设计一个专门的语法是不太值得的。
- 又比如函数定义中,如是不加return语句,就返回最后一条命令运行结果,这实在没有必要,这种节省return的情况反而容易把人给绕晕,看代码的人得分析一番才搞得清这个函数要返回的倒底是什么。
- 还比如特殊变量:$@和$*,都表示所有参数,虽然有一些小小区别,但是为了这一点小区别设计两个语法实在有点小题大作了!
- 比如变量引用,可以是$myvar,也可以是${myvar},从避免代码看起来混乱的角度看,应该强制使用大括号将变量与其他字符进行分隔比较合理。可以对比下下面两种情况,哪一种看起来更舒服,更容易区分哪里是变量哪里是字符串字面量。