Shell脚本编程

Shell

Shell 是一个用C语言编写的程序,它既是一种命令语言,又是一种程序设计语言。

Shell Script

Shell脚本,用shell编写的脚本程序

First Shell

  1. 创建一个.sh为文件后缀的文件,hello.sh
  2. 内容如下
    1
    2
    3
    4
    #!/bin/bash
    #注释
    #author : jeremy
    echo "Hello Shell !"

保存退出

  1. 先赋予执行权限

    1
    # chmod a+x hello.sh
  2. 执行

    1
    # ./hello.sh

变量

定义变量

1
2
3
4
5
6
variable_name=variable_value
等号左右无空格

ex:
User="Jeremy"
Pwd="123456"

访问变量

使用美元符号$访问变量,可以给变量加上{ }花括号,帮助解释器识别变量的边界

1
2
3
4
5
6
#!/bin/sh

User="Jeremy"
Pwd=“123456”
echo $User
echo ${Pwd}

打印 UserPwd 的值

只读变量

使用readonly可以将变量定义为只读变量,只读变量的值不能改变

1
2
3
4
#!/bin/sh

User="Jeremy"
readonly User

删除变量

使用unset命令可以删除变量

1
2
3
4
#!/bin/sh

User="Jeremy"
unset User

变量类型

局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效

环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证正常运行,shell脚本也可以定义环境变量

shell变量

shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

特殊变量

1
2
3
4
5
6
7
$0	当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

数组Arrays

Bash Shell只支持一维数组,初始化时不需要定义数组大小

1
array_name=(value1...valueN)

定义数组

1
2
3
4
5
6
array_name[index]=value

ex:
User[0]="apple"
User[1]="banana"
User[2]="orange"

访问数组

和访问变量格式相同

1
2
3
4
5
6
7
8
9
10
11
${array_name[index]}
ex:
User[0]="apple"
User[1]="banana"
User[2]="orange"
echo ${User[0]}
echo ${User[@]}

以下两种方式可以访问数组中的所有项目
${array_name[*]}
${array_name[@]}

基本运算符

Bourne shell没有任何机制来执行简单的算术,它使用外部程序awk或expr

  • 运算符和表达式之间必须有空格
  • ` ` 倒逗号之间包含完整的表达式
1
2
3
4
#!/bin/sh

val=`expr 2 + 2`
echo $val

算术运算符

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。
== 相等 [$a==$b] 返回 false。
!= 不相等 [$a!=$b] 返回 true。

关系运算符

运算符 说明 举例
-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。

布尔运算符

运算符 说明 举例
! 非运算,表达式为 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。

字符串运算符

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 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。

Shell条件语句

if … fi

shell expression求值,结果是true,statement被执行,否则不执行

1
2
3
4
if[ expression ]
then
Statement(s) to be executed if expression is true
fi

if … else … fi

1
2
3
4
5
6
if[ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi

if … elif … fi

1
2
3
4
5
6
7
8
9
10
11
12
if [ expression 1 ]
then
Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
Statement(s) to be executed if expression 3 is true
else
Statement(s) to be executed if no expression is true
fi

case .. esac

这里的字符串字每个模式进行比较,直到找到一个匹配。执行语句匹配模式。如果没有找到匹配,声明退出的情况下不执行任何动作。
没有最大数量的模式,但最小是一个。
当语句部分执行,命令;; 表明程序流程跳转到结束整个 case 语句。和C编程语言的 break 类似。

1
2
3
4
5
6
7
8
9
10
11
case word in
pattern1)
Statement(s) to be executed if pattern1 matches
;;
pattern2)
Statement(s) to be executed if pattern2 matches
;;
pattern3)
Statement(s) to be executed if pattern3 matches
;;
esac

Shell循环类型

while 循环

这里Shell命令进行计算。如果结果值是 true,给定语句被执行。如果命令为 false,那么没有语句将不执行,程序将跳转到done语句后的下一行。

1
2
3
4
while command
do
Statement(s) to be executed if command is true
done

for 循环

var是一个变量,word1 到 wordN 是由空格分隔的字符(字)序列的名称。每次for 循环的执行,变量var的值被设置为下一个单词的列表中的字,word1 到 wordN 。

1
2
3
4
for var in word1 word2 ... wordN
do
Statement(s) to be executed if command is true
done

until 循环

这里Shell命令进行评估计算。如果结果值是false,给定语句(s)被执行。如果命令没有语句为true,那么将不执行,程序会跳转到下一行done语句后。

1
2
3
4
until command
do
Statement(s) to be executed until command is true
done

select 循环

var是一个变量,word1 到 wordN是由空格分隔的字符(字)序列的名称。每次for循环的执行,变量var的值被设置为下一个单词的列表中的字,由 word1 到wordN。

对于每一个选择的一组命令将被执行,在循环中。这个循环在ksh,并已被改编成的bash。这不是在sh。

1
2
3
4
select var in word1 word2 ... wordN
do
Statement(s) to be executed for every word.
done

Knowledge is priceless, thanks for your support !