C系语言出身的程序员学习bash编程


0 脚本语言作用
 
脚本对于系统运维人员来说就是生产工具,它代表了维护工作的生产力。unix类的系统里脚本得到相当好的发展,windows为了在服务器领域有所突破,也提供了powershell这样的脚本引擎。
 
脚本在分析日志、批量修改、自动处理等领域具有不可替代的作用,脚本是解释性语言,它作为一门独立的语言其功能和效率并不出色,但脚本更重要的是作为一种”粘合剂“把各种功能组合在一起,已完成更复杂的工作。如bash脚本里充斥着大量的常用Linux命令和实用程序,如sed,awk,wc等等。
 
本人接触Linux已有10多年,可惜至今尚未真正用bash做过什么像样的工作,痛定思痛,还是从0开始学起,在此记录学习的点滴与困惑。

Bash脚本15分钟进阶教程

10个 Linux/Unix下 Bash 和 KSH shell 的作业控制实例

Ubuntu下shell脚本运行异常:Bash和dash的区别

Bash脚本之for语句if语句以及各种测试语句

什么是Bash Shell的内建(build in)命令


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
 
 为真的时候执行的语句 

else
 
为假的时候执行的语句
 
当命令执行成功,设置状态码 $?=0, 此时算是为真,这是不是与你的想法正好相反呢?
 
 3 命令与关键字
 
while, for, if, then, do, done这些是关键字,而test 或[ ,break, continue, return都是命令。处于可移植性考虑,不建议在函数体外使用return。

更多详情见请继续阅读下一页的精彩内容:

  • 1
  • 2
  • 下一页

相关内容

    暂无相关文章