我在理解以下示例中的变量 {_,0} 时遇到困难。
在脚本中tmp.sh
:
func()
{
echo $_
echo $0
echo $1
}
使用参数 x 调用 tmp.sh:
~$ ./tmp.sh x
./tmp.sh
./tmp.sh
x
并使用参数 x 获取 tmp.sh:
~$ . ./tmp.sh x
x
bash
x
据我了解$_
和$0
,后者用于第一个参数,如第一个示例中所示./tmp.sh
。为什么它相当于第二个例子中的bash?
扩展为什么.
,前者,我不确定,返回带有源 bash 的最后一个参数,相当于无源 bash 中的 $0 。是这样吗?
答案1
N 是数字时引用的变量$N
是脚本的位置参数。 $0
是第一个参数,即脚本本身。 $1
是第二个参数(引用为 1,因为 bash 从零开始计数,而人类从 1 开始),即 x。
$_
有点奇怪,因为它不是一个特定的位置参数,而是一个特殊的参数,它以正在运行的命令的完整路径开始,但随后在任何扩展之后成为上一个命令的最后一个参数的值。这就是为什么它与第一次运行时相同$0
,而在第二次运行中,您获取脚本时它会扩展为该值x
(这是源解释的上一个命令的最后一个参数)。
有关这些的更多信息,请开始阅读 bash 手册:第 3.4.1 节:位置参数
下一节 3.4.2 包含有关特殊变量的信息,包括$_
.
答案2
0 Expands to the name of the shell or shell script. This is set at shell initialization. If bash is invoked with a file of commands, $0 is set to the
name of that file. If bash is started with the -c option, then $0 is set to the first argument after the string to be executed, if one is present.
Otherwise, it is set to the filename used to invoke bash, as given by argument zero.
基本上,$0
如果执行脚本,会给你脚本的名称,如果交互模式,会给你 bash。请注意.
, 是 的别名source
,不是可执行文件,而是内置的 shell,因此它不会更改 $0 值并使 bash 保持交互模式。
_ At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the environment or argument list.
Subsequently, expands to the last argument to the previous command, after expansion. Also set to the full pathname used to invoke each command exe‐
cuted and placed in the environment exported to that command. When checking mail, this parameter holds the name of the mail file currently being
checked.