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

本文讲述了C系语言背景的程序员学习Bash编程时遇到的习惯转换,包括等号两侧不能有空格、不需要分号、所有变量默认为字符串、true/false是命令而非常量、逻辑判断依赖于退出状态码、命令与关键字的区分、函数无形参以及数字运算的特殊方式等。
摘要由CSDN通过智能技术生成

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。

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))

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值