linux shell编程入门

作为开发人员虽然不需要像运维人员那样精通shell,但是学会编写一些简单的自动化脚本还是可以大大提高我们的工作效率的。而shell的入门门槛也是很低的。下面以思维导图的形式记录我的shell学习路线。希望对阅读到这篇博客的你也有些许帮助。

1.变量
变量对于编程的意义无需多言,而shell中的变量主要包括用户自定义变量,环境变量,预定义变量(包括位置参数变量)这几大类。由于环境变量的特殊性我们拎开讲。下面的思维导图给出了这几大变量的解释以及使用方法
linux shell编程入门


2.环境变量
环境变量在当前shell与当前shell的子shell中都有效。其实我们或多或少都配置过环境变量(Jdk的环境变量,配置命令的别名等)。常见的环境变量配置文件会在用户登录时按特定顺序加载(因此登录成功后环境变量配置文件中的配置都已经生效了,具体有哪些环境变量配置文件以及配置文件的加载顺序在思维导图中有详细的说明)。推荐在bashrc或.bash_profile配置你的环境变量(注意环境变量配置文件修改后需要source一下才能起效)。以下是关于Linux环境变量文件的具体说明:
linux shell编程入门


3.shell运算符
有了变量接下来就要对变量进行运算。注意shell变量的默认类型都是字符串,若想进行算数运算需要使用declare命令将变量声明为整型(注意declare命令无法声明浮点型,Linux进行浮点运算需要借助bc或者awk指令)。
先看看declare命令的使用:
linux shell编程入门

但如果每次进行数值运算都需要使用declare命令手动赋类型未免太过麻烦了。好在shell为我们提供了较为简单的数值运算的方法,推荐使用双小括号的形式进行数值运算。
linux shell编程入门
之前说了shell不支持浮点运算,如

chenfeihaodeMacBook-Pro:sh chenfeihao$ test=10
chenfeihaodeMacBook-Pro:sh chenfeihao$ echo $(($test/3))
3

虽然需要进行浮点运算的场景不多,但可以通过bc或awk命令达到进行浮点运算的目的。

chenfeihaodeMacBook-Pro:sh chenfeihao$ a=1.1
chenfeihaodeMacBook-Pro:sh chenfeihao$ b=1.2
chenfeihaodeMacBook-Pro:sh chenfeihao$ echo $(($a+$b))
-bash: 1.1+1.2: syntax error: invalid arithmetic operator (error token is ".1+1.2")
chenfeihaodeMacBook-Pro:sh chenfeihao$ c=$(echo "$a+$b"|bc)
chenfeihaodeMacBook-Pro:sh chenfeihao$ echo $c
2.3

*bc命令对于/运算符不生效。

下面介绍shell支持的大部分运算符

Shell运算符类型如下:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

1、算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 -10。
* 乘法 `expr $a \* $b` 结果为 200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

2、关系运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

3、布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

4、逻辑运算符

运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

5、字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n "$a" ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

6、文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

操作符 说明 举例
-b 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

4.shell条件运算
程序的语句一般有三大结构,顺序条件与循环,shell也不例外,下面介绍一下shell如何进行条件运算。上一小节已经介绍了shell中常用的运算符,shell就是通过这些运算符进行条件判断的。一个简单的用例如下:

chenfeihaodeMacBook-Pro:sh chenfeihao$ a=1
chenfeihaodeMacBook-Pro:sh chenfeihao$ b=2
chenfeihaodeMacBook-Pro:sh chenfeihao$ [ $a -eq $b ]
chenfeihaodeMacBook-Pro:sh chenfeihao$ echo $?
1

还记得我们第一小节说的$?作为预定义变量,表示的是命令的执行结果,0表示成功。由于1与2不相等所以$?的结果为1(这个结果是由程序的编写者决定的)。除了数字间的比较我们还可以进行字符串的比较,文件的比较,文件的类型比较等。还可以使用逻辑运算符对比较结果进行取反,连接等操作:
取反

chenfeihaodeMacBook-Pro:sh chenfeihao$ [ ! $a -eq $b ]
chenfeihaodeMacBook-Pro:sh chenfeihao$ echo $?
0

连接

chenfeihaodeMacBook-Pro:sh chenfeihao$ [ $a -eq $b -a $a -lt $b ]
chenfeihaodeMacBook-Pro:sh chenfeihao$ echo $?
1

5.shell流程控制
下面正式介绍shell中的流程控制语句。顺序结构的程序自然不必多说,主要介绍分支与循环的流程控制语句。shell中的流程控制思想与一般编程语言并没有什么不同,只是需要适应一下它比较独特的语法:
linux shell编程入门


6.实战
学会了流程控制语句后shell编程的入门就算基本结束了。可以着手编写一些简单的shell脚本进行练习与巩固了。平时工作学习中遇到可以使用shell脚本提高效率的情况也可以尝试使用。下面是我练习shell脚本的github地址。随缘更新orz
practice shell