Shell脚本学习

注释

1
2
# 单行注释
:> 多行注释

变量

局部变量:在脚本中定义,只在shell实例中生效

环境变量:也就是当前环境变量

变量操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建变量(等号两边不能有空格)
name="test"

# 创建局部变量(只在函数体中使用)
local name="test"

# 使用变量
echo $name
echo ${name}

# 创建只读变量(不可被修改)
name="only_read"
readonly name

# 删除变量
unset name

字符串变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 单引号(保持原字符输出,不支持转义,格式化,单引号中不能出现单独单引号)
var='test'

# 双引号(可以转义)
var="my name is ${name}"

# 获取字符串长度,使用#符号
name="test"
echo ${#name}

# 提取字符串(类似于python字符串切片)
name="this is my name"
echo ${name:1:4}

数组

bash只支持一维数组,不支持多维。

定义数组用小括号作边界,空格分离。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 定义数组
array_name=(zhangly zhoujl chenyifa)

# 数组元素赋值
array_name[2]="yangcl"

# 获取数组元素
echo ${array_name[1]}

# 输出数组所有元素
echo ${array_name[@]}

# 获取数组元素个数
echo ${#array_name[@]} 或者 echo ${#array_name}

参数传递

获取参数值。

1
2
3
4
5
6
7
8
9
10
$0 #固定的,代表执行的文件名
$1 #代表传入的第1个参数
$n #代表传入的第n个参数

$# #参数个数
$* #以一个单字符,输出所有向脚本传递的参数
$@ #与$*相同
$$ #脚本运行的当前进程号
$! #后台运行的最后一个进程的ID
$? #显示最后命令的退出状态。0表示没有错误,其他的任何值表示有错误。

算数运算

+, -, *, \ 四个运算符,其中乘号必须加\进行转义。

1
2
3
val=`expr 2 + 2`
val=$[2+2]
val=$((2+2))

数字关系运算符

只支持数字,不支持字符串。

下面假定变量a为10,变量b为20。

注意语法上需要四个空格。

1
2
3
4
5
6
-eq: 检测两个数相等,相等返回true。  [ $a -eq $b ]
-ne: 检测两个数是否不想等,不想等返回true。 [ $a -ne $b ]
-gt: 检测左边的数是否大于右边的,如果是,则返回true。[ $a -gt $b ]
-lt: 检测左边的数是否小于右边的,如果是,则返回true。[ $a -lt $b ]
-ge: 检测左边的数是否大于等于右边,如果是,则返回true。 [ $a -ge $b ]
-le: 检测左边的数是否小于等于右边,如果是,则返回true。 [ $a -le $b ]

字符串运算符

1
2
3
4
5
=: 检测两个字符串是否相等,相等返回true。 [ $a = $b ]
!=: 检测两个字符串是否相等,不想等返回true。 [ $a != $b ]
-z: 检测字符串长度是否为0,为0返回true。 [ -z $a ]
-n: 检测字符串长度是否为0,不为0返回true
$: 检测字符串是否为空,不为空返回true

布尔运算符

1
2
3
!: 非运算,返回相反的布尔值。             [!false]
-o: 或运算,有一个表达式为true则返回true。 [$a -lt 20 -o $b -gt 100]
-a: 与运算,所有表达式都为true则返回true。 [$a -lt 20 -a $b -gt 100]

逻辑运算符

1
&&: 逻辑