17. 位置参数
传递给 shell 脚本的参数可以作为位置参数进行引用。
$1
- 第 1 个参数$2
- 第 2 个参数- ..
$10
- 第 10 个参数$11
- 第 11 个参数
当你有两个数字时,你应该使用 ${}
格式来引用它们。 $0
是脚本的名称。
$ cat args.sh
echo "Script Name: $0"
echo "First Parameter: $1"
echo "Second Parameter: $2"
echo "Third Parameter: $3"
echo "All Parameters: $*"
echo "All Parameters: $@"
echo "Total Number of Parameters: $#"
$ ./args.sh CA NY UT
Script Name: ./args.sh
First Parameter: CA
Second Parameter: NY
Third Parameter: UT
All Parameters: CA NY UT
All Parameters: CA NY UT
Total Number of Parameters: 3
$0
、$*
、$@
不是位置参数。 它们是特殊参数。 我们将在后面的技巧中详细讨论特殊参数。
另外,请注意$0
的值是根据脚本的调用方式设置的:
- 对于
./args.sh CA NY UT
,$0
是./args.sh
。 - 对于
/home/ramesh/args.sh CA NY UT
,$0
是/home/ramesh/args.sh
。
出于调试目的,如果要显示所有参数,请使用以下单行代码片段。
$ vi args1.sh
printf '"%b"\n' "$@" | cat -n
$ ./args1.sh CA NY UT
1 "CA"
2 "NY"
3 "UT"
$*
和 $@
之间的区别:
它们的行为完全相同,除非您用双引号包围它们。 当双引号"$*"
时,它会转换为"${1}x${2}x${3}x..."
。 其中,x
是
IFS
变量的第一个字符。
因此,除非有特定原因,否则应始终使用 $@
。 以下示例显示了这种差异。
$ vi args2.sh
IFS="<^"
echo -n '[$*] = '
echo $*
echo -n '[$@] = '
echo $@
echo -n '["$*"] = '
echo "$*"
echo -n '["$@"] = '
echo "$@"
$ ./args2.sh one two three
[$*] = one two three
[$@] = one two three
["$*"] = one<two<three
["$@"] = one two three