Answers:
从这里:
$# Stores the number of command-line arguments that
were passed to the shell program.
$? Stores the exit value of the last command that was
executed.
$0 Stores the first word of the entered command (the
name of the shell program).
$* Stores all the arguments that were entered on the
command line ($1 $2 ...).
"$@" Stores all the arguments that were entered
on the command line, individually quoted ("$1" "$2" ...).
因此,基本上,$#
执行脚本时会给出许多参数。$*
是包含所有参数的字符串。例如,$1
是第一个参数,依此类推。如果要访问脚本中的特定参数,这很有用。
正如Brian所说,这是一个简单的例子。如果运行以下命令:
./command -yes -no /home/username
$#
= 3$*
= -yes -no /home/username
$@
=数组: {"-yes", "-no", "/home/username"}
$0
= ./command
,$1
= -yes
等。这些是POSIX标准的一部分,所有兼容的shell都应支持它们。作为参考,以下是每个特殊参数的POSIX标准定义。请注意有三个附加变量:$-
,$$
和$!
。
$@
:
从1开始扩展到位置参数。当在双引号内进行扩展时,并且在执行字段拆分(请参见Field Splitting)的情况下,每个位置参数都应作为一个单独的字段扩展,但前提是第一个参数的扩展仍应与的开头部分结合在一起。原始单词(假设扩展参数已嵌入单词中),而最后一个参数的扩展仍应与原始单词的最后部分结合在一起。如果没有位置参数,即使“ @”被双引号引起,“ @”的扩展也将产生零字段。
$*
:
从一个开始扩展到位置参数。当在双引号引起来的字符串中进行扩展时(请参见Double-Quotes),它将扩展为单个字段,每个参数的值由IFS变量的第一个字符或未设置IFS的分隔。如果将IFS设置为空字符串,则不等于取消设置它;它的第一个字符不存在,因此将参数值连接在一起。
$#
:
扩展为位置参数的十进制数。命令名称(参数0)不应计入'#'给出的数字中,因为它是一个特殊参数,而不是位置参数。
$?
:
扩展为最新管道的小数退出状态(请参见Pipelines)。
$-
:
(连字符)扩展为在调用时,通过set特殊内置命令或由shell隐式指定的当前选项标志(将单个字母的选项名称并置为字符串)。
$$
:
扩展为被调用shell的十进制进程ID。在子Shell中(请参见Shell Execution Environment),“ $”应扩展为与当前Shell相同的值。
$!
:
扩展为从当前shell执行的最新后台命令(请参见List)的十进制进程ID 。(例如,从子Shell执行的后台命令在当前Shell环境中不会影响“ $!”的值。)对于管道,进程ID是管道中最后一个命令的ID。
$0
:
(零。)扩展为shell或shell脚本的名称。有关此名称的派生方式的详细说明,请参见sh。
$*
并且$#
是1)shell变量,而不是环境变量;2)标准化(POSIX规范的一部分。)
$#
代表参数数量:
[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1
[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3