Linux 中的 $* 和 $# 是什么?

Linux 中的 $* 和 $# 是什么?

Linux中下列环境变量代表什么意思?

  1. $*(美元符号后跟星号)是什么?
  2. $#(井号/数字符号/八字号/磅号旁边的美元符号)是什么?

答案1

这里

$#    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 开始。当扩展发生在双引号字符串中时(请参阅双引号),它应扩展为单个字段,每个参数的值由 IFS 变量的第一个字符分隔,如果 IFS 未设置,则由 分隔。如果 IFS 设置为空字符串,这并不等同于取消设置它;它的第一个字符不存在,因此参数值被连接起来。

$#

扩展为位置参数的十进制数。命令名称(参数 0)不应计入“#”给出的数字中,因为它是一个特殊参数,而不是位置参数。

$?

扩展为最近管道的十进制退出状态(参见管道)。

$-

(连字符)扩展为调用时指定的当前选项标志(连接成字符串的单字母选项名称),由特殊的内置命令,或者由 shell 隐式指定。

$$

扩展为所调用 shell 的十进制进程 ID。在子 shell 中(参见Shell 执行环境),‘$’应扩展为与当前 shell 相同的值。

$!

扩展为最近的后台命令的十进制进程 ID(参见列表) 从当前 shell 执行。(例如,从子 shell 执行的后台命令不会影响当前 shell 环境中“$!”的值。)对于管道,进程 ID 是管道中最后一个命令的进程 ID。

$0

(零。)扩展为 shell 或 shell 脚本的名称。请参阅了解有关此名称如何得来的详细说明。

答案2

$#表示参数的数量:

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3

相关内容