shell脚本编程

注释

#单行注释

#开始, 从#开始直到行尾都会被当做注释

#多行注释

1
2
3
4
5
:<<EOF
注释内容...
注释内容...
注释内容...
EOF

EOF可以换成任意内容

变量

#定义变量

变量名=值

注意等号前后不能有空格

1
2
a=1
b="Hello world"

#使用变量

读取变量的值时需要在前面添加$

1
2
3
echo $a
echo ${a}
echo $b

#修改变量

再次修改变量的值时不需要添加$

1
2
a=2
b="World Hello"

#只读变量

readonly 变量名

可以将一个变量设置为只读

#删除变量

unset 变量名

数据类型

#数字

#字符串

可以用单引号括起来也可以用双引号, 区别是单引号括起来的字符串不会转义

1
2
3
a=1
echo '$a\"\"b' $a\"\"b
echo "$a\"\"b" 1""b

#拼接字符串

1
2
3
4
greeting="hello";
name="world"
msg="$greeting $name"
echo $msg hello world

#获取字符串长度

1
echo ${#msg}  11

#截取字符串

格式见示例, 两个参数分别为起始位置和长度

1
echo ${msg:4:3}  o w

数组

数组名=(元素1 元素2 ... 元素n)

1
2
a=(1 2 3)
b=("Hello" "," "World")

也可以单独定义数组的各个分量

1
2
3
4
arr[0]=1
arr[1]="2"
arr[5]=3
arr[100]=4

shell中数组的下标从0开始, 可以不是连续的

#读取数组元素

${数据名[下标]}

下标使用 @ 符号可以获取数组中的所有元素

1
2
3
4
a=(1 2 3 4 5)
echo ${a[0]} # 1
echo ${a[3]} # 4
echo ${a[@]} # 1 2 3 4 5

#获取数组的长度

1
2
echo ${#arr[@]}
echo ${#arr[*]}

控制流

#条件分支

1
2
3
4
5
6
7
8
9
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

#循环语句

for-in循环

1
2
3
for index in 1 2 3 4 5; do
echo $index
done

for-i循环

1
2
3
for ((i=0; i<5; i++)); do
echo $i
done

while循环

1
2
3
4
5
6
i=1
while(( $i<=5 ))
do
echo $i
let "i++"
done

调用参数

调用脚本时可以传递一些参数, 在脚本内可以通过如下转义表达式获取参数

参数处理说明
$#传递到脚本的参数个数
$n传递到脚本的第n个参数, 0为脚本文件名
$*以一个单字符串显示所有向脚本传递的参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@$*相同,但是每个参数都会带引号。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
1
2
3
4
5
6
7
8
9
#!/bin/bash
echo "Shell 传递参数实例!"
echo "参数个数为: $#"
echo "执行的文件名: $0"
echo "第一个参数为: $1"
echo "第二个参数为: $2"
echo "第三个参数为: $3"
echo "所有参数为: $*"
echo "当前进程: $$"