位置参数
在执行 shell 脚本时,我们可以向 shell 脚本传递命令行参数(位置参数)。
获取参数可以通过特殊变量$n
,其中 n 为非负整数,$0
是当前执行文件名。
位置参数从序号 1 开始,$1
是第一个参数,$2
是第二个参数,以此类推。
当n >= 10
时,需要使用${10}
来引用,和引用变量是一样的,用来标识边界。
test.sh
1
2
3
4
5
#!/bin/bash
echo "文件名: $0"
for arg in "$@"; do
echo "参数 $((++num)): $arg"
done
执行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ ./test.sh
文件名: ./test.sh
$ ./test.sh 1 2 3
文件名: ./test.sh
参数 1: 1
参数 2: 2
参数 3: 3
$ ./test.sh zfl9 baidu google 'a b c'
文件名: ./test.sh
参数 1: zfl9
参数 2: baidu
参数 3: google
参数 4: a b c
几个特殊变量
变量名 | 说明 |
---|---|
$0 | 当前的可执行文件名 |
$n | 第 n 个命令行参数,n 从 1 开始 |
$# | 命令行参数个数,不包括$0 |
$@ | 所有命令行参数,不包括$0 |
$* | 所有命令行参数,不包括$0 |
$? | 最后一个命令的退出值,0 为无错误,其它值为有错误 |
$$ | 当前 shell 进程的 PID |
$! | 最后一个后台任务的 PID |
$@ 和 $* 区别
和前一节数组的${arr[@]}
、${arr[*]}
类似,在双引号中有区别:
test.sh
1
2
3
4
5
6
7
8
#!/bin/bash
for arg in "$@"; do
echo "$arg"
done
echo "--------"
for arg in "$*"; do
echo "$arg"
done
执行结果
1
2
3
4
5
6
7
8
$ ./test.sh 1 2 3 4 5
1
2
3
4
5
--------
1 2 3 4 5
传参数时加引号和不加引号区别
- 加引号:shell 会将引号内的字符串作为单个参数传递给命令。
- 不加引号:shell 会使用空白符进行分词,将分词结果传递给命令。
请养成使用引号的习惯(特别是有特殊字符、空白符时),可以避免很多问题!
test.sh
1
2
3
4
5
#!/bin/bash
echo "参数个数: $#,分别为:"
for arg in "$@"; do
echo "$arg"
done
执行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ./test.sh 1 2 3
参数个数: 3,分别为:
1
2
3
$ ./test.sh "1 2 3"
参数个数: 1,分别为:
1 2 3
$ ./test.sh "1 2" 3
参数个数: 2,分别为:
1 2
3