跳转至

C. Bash/Shell编程

C. Bash/Shell编程

更新日期:2020-07-24


1. bash脚本里面能包含什么

bash脚本里面可以直接写linux命令。并可以使用变量保存命令的执行结果。 和通常的脚本语言一样,也具有变量、控制语句和函数等。

2. 创建脚本文件并执行

脚本程序保存在.sh扩展名的文件中。 文件的格式是有要求的,以hello world程序为例。

test.sh

1
2
3
#!/bin/bash

echo "Hello World!"
或者
1
2
3
#!/bin/sh

echo "Hello World!"

文件开头第一行是固定的。

要执行脚本文件,需要赋予它可执行权限,并使用如下命令来运行:

1
2
3
4
5
./test.sh
# 或者
sh test.sh
# 或者
bash test.sh

3. 设置错误执行标记

脚本文件中通常会执行大段的linux命令。默认情况下,如果某一条命令执行失败,会继续往下执行。

如果需要在命令执行失败时中断执行,可以加上-e标记,虽然可以在执行脚本时加上这个标记,但方便期间可以直接加在文件的头部。

1
#!/bin/bash -e

4. 语法参考

4.1 变量

定义一个变量

1
myVar="Hello"

引用一个变量

1
echo "${myVar}"

4.2 执行linux命令

shell脚本中最便利的一点是可以直接执行linux命令,任何可以在命令行中执行的命令都可以。

并且命令的执行结果可以保存在变量中。此时命令需要用反单引号括起来。

例如:

1
2
3
cd /
myVar=`ls -la`
echo "${myVar}"

执行后会原样输出命令的执行结果。 注意echo命令的字符串参数要加上双引号,否则不能正常解析字符串中的换行制表等符号。

4.3 注释

使用#符号来加注释,通常都是整行注释。并不会在语句的末尾加#。

4.4 函数

定义一个函数

1
2
3
4
function myFunc()
{
    echo "Hello world!"
}

虽然function和括号等关键字可以省略,但是为了可读性还是加上比较好。

调用一个函数并传参数

1
myFunc param1 param2

要注意并不用加括号。

引用参数

1
2
3
4
5
function myFunc()
{
    echo "param2=${2}"

}

虽然大括号可以省略,但为了统一起见还是加上比较好。

退出函数

可以使用关键字return来退出函数,但是函数的返回值并不跟通常的编程语言一样。

最后,函数必须定义在调用的代码前面。

4.5 控制结构

分支

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
if 条件; then  
    
    命令1
    命令2
elif 条件; then    
    
    命令3
    命令4
else    
    
    命令5
fi  

注意条件不要随便加括号,一般的linux命令不能加括号。

循环

使用for语句进行循环比较常见。

1
2
3
4
5
for myVar in item1 item2 ... itemX do

    命令1
    echo "${myVar}"
done

in后面的列表可以为固定的几个值。也可以跟命令的运行结果。

比如循环读取文件的每一行:

1
2
3
4
for line in `cat test.txt` do

    echo "${line}"
done

还可以使用while来进行循环:

1
2
3
4
while 条件; do

    命令1
done

同样在循环中可以使用break和continue。

选择

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
case myVar in
0)

    命令1
    ;;
1)

    命令2
    ;;
*)

    命令3
    ;;
esac

4.6 数学运算

这里并没有其他编程语言中的运算符。要进行数学运行需要把表达式写在字符串中并使用一些命令来进行运算。方法比较多,这里使用方括号$[ ]是比较全面的一个办法,并且表达式写起来也比较干净。

1
2
3
x=1
x=$[(1+2)*3 - 45/9 + ${x}]
echo "${x}"

加减乘除都支持,最后会输出5。

4.7 Test命令

Test命令通常配合控制语句一起使用。可以用来测试数值、字符串、文件以及逻辑运算。

在控制语句中,test命令通常简写为方括号的形式。

1
if [ ${x} -eq 13 ]; then

注意方括号旁边必须有空格,后面要加分号。这个语法看着有点奇葩。

数值

命令 说明
-eq 相等
-ne 不相等
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于

字符串

命令 说明
-z 空字符串
-n 非空字符串
== 相等
!= 不相等

文件

命令 说明
-d 是一个目录
-e 指定的文件存在
-f 指定的是一个通常的文件(不是目录)
-L 是一个链接文件
-r 文件可读
-s 文件大小 > 0
-w 文件可写
-x 文件可执行

逻辑运算

命令 说明
! 条件 否定
条件1 -a 条件2 并且
条件1 -o 条件2 或者

4.8 命令粘合运算符&&和||

1
命令1 && 命令2

如果命令1执行成功则执行命令2。

1
命令1 || 命令2

如果命令1执行失败才会执行命令2。