首页 Shell 位置参数
文章
取消

Shell 位置参数

位置参数

在执行 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 i in "$@"; do
    echo $i
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
本文由作者按照 CC BY 4.0 进行授权

Shell 数组

Shell 运算符