0 脚本语言作用
脚本对于系统运维人员来说就是生产工具,它代表了维护工作的生产力。unix类的系统里脚本得到相当好的发展,windows为了在服务器领域有所突破,也提供了powershell这样的脚本引擎。
脚本在分析日志、批量修改、自动处理等领域具有不可替代的作用,脚本是解释性语言,它作为一门独立的语言其功能和效率并不出色,但脚本更重要的是作为一种”粘合剂“把各种功能组合在一起,已完成更复杂的工作。如bash脚本里充斥着大量的常用Linux命令和实用程序,如sed,awk,wc等等。
本人接触Linux已有10多年,可惜至今尚未真正用bash做过什么像样的工作,痛定思痛,还是从0开始学起,在此记录学习的点滴与困惑。
1 C语言的编码习惯在Bash里不适用
和大多数国内的IT人一样,本人也是出身于从C系语言入门IT界,C,C++,C#,JAVA这些都是C系语言。带着这样的背景学习Bash编程时,往往很不习惯,一些在C看来良好的编码习惯在Bash世界里完全行不通。
1.1 等号两边不能有空格
1.2 语句末尾不用分号
1.3 默认所有的变量都是字符串类型
1.4 变量名和变量的值不能混用
2 true和false
2.1 true,false是命令不是常量
通常程序员接触到的true,false是语言里提供的常量,代表逻辑的真与假。而在bash里这种想法不再好用,因为这是bash内建的两个命令,其作用非常简单就是用来修改exit状态码,我们测试得到true命令设置状态码为0,而false设置状态码为1,这与我们C出身的程序员的想法正好相反。
2.2 逻辑判断的依据是退出状态码
看到if, while等,C出身的程序员眼里想到的是真与假的判断问题。在BASH里也一样,只是bash里没有逻辑变量一说,bash中的逻辑判断的依据是上一次命令的退出状态码,如果上一个命令成功执行,那么就判定为真。而POSIX规定了退出码的标准:0表示命令成功执行;其他表示不成功。所以bash的if语句如下:
if 命令
then
为真的时候执行的语句
else
为假的时候执行的语句
当命令执行成功,设置状态码 $?=0, 此时算是为真,这是不是与你的想法正好相反呢?
3 命令与关键字
while, for, if, then, do, done这些是关键字,而test 或[ ,break, continue, return都是命令。处于可移植性考虑,不建议在函数体外使用return。
4 函数没有形参
函数定义时,不能有形参,function 关键字可以省略。如下
function myfun() {
echo $1
echo $2
echo (($1+$2))
}
调用函数时,不能用(),只使用函数名即可,如
myfun
如果要使用参数,函数里使用的是位置参数,在函数体内通过$1, $2, ...获取参数值,如上所示。提供实参则直接如下
myfun 10 20
5 对数字运算支持较差
bash不能直接支持数字运算,需要如下三种特殊方式
(1) 使用expr命令
a=10
a=$(expr $a + 1 )
(2)使用let
let a++
let只能增1
(3)使用$(())
a=$(($a+1))