0 脚本语言作用
脚本对于系统运维人员来说就是生产工具,它代表了维护工作的生产力。unix类的系统里脚本得到相当好的发展,windows为了在服务器领域有所突破,也提供了powershell这样的脚本引擎。
脚本在分析日志、批量修改、自动处理等领域具有不可替代的作用,脚本是解释性语言,它作为一门独立的语言其功能和效率并不出色,但脚本更重要的是作为一种”粘合剂“把各种功能组合在一起,已完成更复杂的工作。如bash脚本里充斥着大量的常用Linux命令和实用程序,如sed,awk,wc等等。
本人接触Linux已有10多年,可惜至今尚未真正用bash做过什么像样的工作,痛定思痛,还是从0开始学起,在此记录学习的点滴与困惑。
10个 Linux/Unix下 Bash 和 KSH shell 的作业控制实例
Ubuntu下shell脚本运行异常:Bash和dash的区别
1 C语言的编码习惯在Bash里不适用
和大多数国内的IT人一样,本人也是出身于从C系语言入门IT界,C,C++,C#,JAVA这些都是C系语言。带着这样的背景学习Bash编程时,往往很不习惯,一些在C看来良好的编码习惯在Bash世界里完全行不通。
1.1 等号两边不能有空格
在C语言里,编写代码时一般都提倡在=两侧增加空格,如 a = 2; 这种良好的习惯到了Bash就变成了错误,Bash要求等号两侧不允许出现空格,否则就是语法错误!只能写成a=2。
这里稍微分析一下:因为bash是通过空格来隔离命令以及参数的,如果写成a = 2,那么bash会把a当成一个命令来执行,从而导致找不到一个叫做a的命令而宣告失败。
1.2 语句末尾不用分号
在C语言里,分号;是分割语句的语法要求,而在Bash里含义完全不同。Bash语法的语句分割符号就是换行符号,一行代表一个语句,如果要在一行出现两个以上语句,语句之间通过分号;进行区别。如
a=2;b=3与以下等同
a=2
b=3
1.3 默认所有的变量都是字符串类型
分析如下bash会输出什么。
a=2
b=3
c1=$a+$b
c2=a+b
c3=$(($a+$b))
echo $c1
echo $c2
echo $c3
答案是:
2+3
a+b
5
在Bash里,任何值默认都是字符串,不管加没加引号。两个字符串放到一起就是连接。在这个例子里,a这个变量初始值为字符串"2",b初始值为字符串"3",c1就是把”2“,”+","3"这三个字符串连接起来的字符串”2+3“;c2被直接初始化为字符串"a+b"。能够按照数字进行计算的方式就是把算数表达式放到$((算数表达式))里,本例中就是相当于$((2+3))。另外一种进行算数运算的方式是通过declare -i 声明变量的类型为数值而不是字符串,以后再说。
1.4 变量名和变量的值不能混用
在C语言里变量名就代表这个变量,当引用变量值的时候,直接用变量名即可。而在Bash里,引用变量的值必须在变量名前加$前缀。看例子:
a=hello
echo a
echo $a
分别输出
a
hello
因为Bash里把不是命令和关键字的东西都当成是字符串,所以当echo a时,会把a当成事"a"字符串输出。让Bash识别出不是字符串而是变量值的方法就是加$,此时Bash会查找变量的值来替换$a。
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
为真的时候执行的语句