答案1
参考3.4.2 特殊参数来自Bash 参考手册。
特殊参数:
*
(
$*
) 扩展到位置参数,从 1 开始。当扩展不在双引号内时,每个位置参数都会扩展为一个单独的单词。在执行它的上下文中,这些单词会受到进一步的单词分割和路径名扩展。当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由IFS
特殊变量的第一个字符分隔。也就是说,"$*"
相当于"$1c$2c…"
,其中C是变量值的第一个字符IFS
。如果IFS
未设置,参数之间用空格分隔。如果IFS
为 null,则连接参数而不插入分隔符。
@
(
$@
) 扩展到位置参数,从 1 开始。当扩展发生在双引号内时,每个参数都会扩展为一个单独的单词。即,"$@"
相当于"$1" "$2" …
。如果双引号扩展发生在单词内,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后部分连接。当没有位置参数时,"$@"
扩展$@
为空(即,它们被删除)。
#
(
$#
) 扩展为十进制位置参数的数量。
?
(
$?
) 扩展到最近执行的前台管道的退出状态。
-
(
$-
连字符。)扩展为调用时指定的当前选项标志、内置命令set
或 shell 本身设置的选项标志(例如选项-i
)。
$
(
$$
) 扩展为 shell 的进程 ID。在()
子 shell 中,它扩展为调用 shell 的进程 ID,而不是子 shell。
!
(
$!
) 扩展为最近放入后台的作业的进程 ID,无论是作为异步命令执行还是使用bg
内置命令执行(请参阅作业控制内置)。
0
(
$0
) 扩展为 shell 或 shell 脚本的名称。这是在 shell 初始化时设置的。如果使用命令文件调用 Bash(请参阅外壳脚本),$0
设置为该文件的名称。如果 Bash 使用该选项启动-c
(请参阅调用 Bash),然后$0
设置为要执行的字符串之后的第一个参数(如果存在)。否则,它被设置为用于调用 Bash 的文件名,如参数零给出的那样。
这也可以从 Bash 的手册页打印:
$ man bash | awk '/Special Parameters$/','/Shell Variables$/'
与上面的内容相同POSIX 中定义的特殊参数。
此外,还有位置参数$1
, $2
, ... 包含 shell 或当前函数的命令行参数 (3.4.1 位置参数)。它们也是 POSIX 功能。
旧版本的 Bash 也被列为$_
特殊参数,但现在它与 shell 设置的其他变量一起列出(5.2 Bash 变量)。$_
不是 POSIX,其他 shell 可能不支持它。
_
(
$_
,下划线。)在 shell 启动时,设置为用于调用在环境或参数列表中传递的 shell 或正在执行的 shell 脚本的绝对路径名。随后,在扩展后扩展至上一个命令的最后一个参数。还设置为用于调用执行的每个命令并放置在导出到该命令的环境中的完整路径名。检查邮件时,该参数保存邮件文件的名称。
答案2
根据Bash 脚本编写指南。
的进程 ID (PID)脚本本身。 $$ 变量经常在脚本中用于构造“唯一”临时文件名。如果您echo $$
在脚本中运行,您会看到输出与当前 shell 的 PID 不同。