在Linux中,$ *和$#是什么?


82

Linux中以下环境变量是什么意思?

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

Answers:


114

这里

$#    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
这些特殊参数在所有Bourne派生的shell中都是正确的(例如sh,bash,dash,ash,ash,ksh,zsh)。
丹尼斯·威廉姆森

更正:$*并且$#是1)shell变量,而不是环境变量;2)标准化(POSIX规范的一部分。)
grawity 2011年

3
另请注意,由于可移植性原因,"$@"很多时候都写为${1+"$@"},请参见stackoverflow.com/questions/743454/…以获得解释。
hlovdal

由于“命令名称(参数0)应不计...”,在上述的例子应该是$#= 2,从0开始计数
约瑟夫Klimuk

0

$# 代表参数数量:

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

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

2
欢迎来到超级用户。该站点是一个知识库,因此其目的是使每个答案都可以为尚未提出的问题提供解决方案。这仅解决了一半的问题,并且先前的答案中已经很好地涵盖了该信息。
fixer1234 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.