什么差异导致了这些命令的不同结果?
a=2 echo $a
set a=2 echo $a
a=2; echo $a
set a=2; echo $a
答案1
a=2 echo $a
结果: 输出一个空行
原因:Bash 提供了其变量的一个子集(环境)到你用它调用的每个程序(你可以用
export
内置)。在命令前加上前缀 ega=2
会告诉 bash 将$a
(带有值2
) 添加到环境中,但是- 仅适用于该特定程序,并且
- 而不是其自身使用的变量集
bash
。
所以,如果
echo
有一个程序(它是实际上是一个内置$a
),它将与其他环境变量一起接收……但是echo
不在乎关于环境变量 - 它只会返回您提供的参数。由于$a
本身并未定义为变量bash
,因此您的命令相当于一个裸echo
命令,它会发出换行符,从而为您提供一个空白行。
set a=2 echo $a
结果: 没有输出
原因:这并不是你所想的那样——事实上,命令
echo
根本没有被调用。当set
不带选项调用,它设置位置参数按顺序执行您提供的参数。您可以使用几个额外的命令来查看此信息:$ set a=2 echo $a $ echo $1 a=2 $ echo $2 echo
...并
echo $3
给出一个空白行,因为您试图设置$3
为$a
,但它不存在。
a=2; echo $a
结果: 输出
2
(最后!)原因:这是获取所需内容的正确方法:将变量设置
$a
为2
,然后将其echo
作为$a
参数进行调用。
set a=2; echo $a
结果:
- 如果
$a
已经设置为2
:输出2
- 如果
$a
未设置:输出一个空行
原因:希望您能根据上述解释自己解决这个问题。
- 如果