Linux中下列环境变量代表什么意思?
- $*(美元符号后跟星号)是什么?
- $#(井号/数字符号/八字号/磅号旁边的美元符号)是什么?
答案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