设为首页 加入收藏

TOP

C系语言出身的程序员学习bash编程
2014-11-23 23:22:51 来源: 作者: 【 】 浏览:4
Tags:语言 出身 程序员 学习 bash 编程

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 等号两边不能有空格

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。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++中结构体的声明和定义的用法 下一篇C++程序运行时内存布局之--------..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: