看一下下面的交互式外壳。
mcd ()
{
echo $1
}
mcd abc
#>>> abc
echo $1
#>>>
我知道source
不会创建子进程。那么为什么要mcd abc
扩展$1
到 abc 而不echo
创建呢?
答案1
位置参数具有作用域。在这种情况下,您将它abc
作为参数传递给函数,但稍后您尝试从函数外部mcd()
访问它。显然,函数内部和函数外部是两个不同的变量,它们具有相同的名称,但作用域和值不同。$1
$1
$1
考虑这个例子:
cat ./script.sh
#!/bin/bash
mcd() { echo "Inner: $1"; }
echo "Outer: $1"
mcd "$1"
mcd "Bar"
echo "Outer: $1"
./script.sh "Foo"
Outer: Foo
Inner: Foo
Inner: Bar
Outer: Foo
答案2
位置参数只有在这样做的时候才会被分配一个值,例如在脚本内部或当您向执行的脚本提供参数时。
Matrix 已经解释得很好了。$1 和所有其他位置参数在当前 shell 中通常总是空的。
guest@porteus:~$ bash
guest@porteus:~$ echo $0
bash
guest@porteus:~$ echo $1
guest@porteus:~$ [Ctrl+D]
exit
guest@porteus:~$ bash TEST
bash: TEST: No such file or directory
guest@porteus:~$ echo $?
127
如您所见,您无法为新 shell(本例中为 bash)提供随机参数,因为 bash 不接受某些随机参数。您在上面的示例中看不到的是,最后一次启动第二个 bash 的尝试失败了,如果我按 [Ctrl+D] 退出,我将退出唯一正在运行的 bash 实例 - 这意味着终端窗口或终端仿真器中的当前选项卡将直接关闭,因为没有启动另一个 bash,该 bash 通过
$?
是唯一正在运行的 bash,并且尝试在初始 bash 上启动第二个 bash 失败(同时返回“127”错误代码 - 但只有当您明确要求通过 $? 显示时才会看到错误代码 - 0 表示没有错误,除 0 以外的任何值都表示存在某种错误)