首页 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 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
本文由作者按照 CC BY 4.0 进行授权

Shell 数组

Shell 运算符