• 本页内容

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