为什么即使我向 bash shell 传递了参数,echo $1 也会返回空输出?

为什么即使我向 bash shell 传递了参数,echo $1 也会返回空输出?

看一下下面的交互式外壳。

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 以外的任何值都表示存在某种错误)

相关内容