为什么“ var = value echo $ var”不发出值?

时间:2019-03-20 18:32:53

标签: linux bash shell

想验证我对这些情况为何表现不同的理解:

我认为发生#1是因为赋值和echo在shell中作为单个命令运行,并且在执行echo时未设置$ SOME_VAR(shell在执行之前扩展了所有变量)。

#1
$ unset SOME_VAR
$ SOME_VAR=abcdef  echo $SOME_VAR # prints nothing

我认为发生#2是因为赋值和echo在同一shell中作为两个单独的命令运行,并且在执行echo时在shell中设置了$ SOME_VAR。

#2
$ unset SOME_VAR
$ SOME_VAR=abcdef   ; echo $SOME_VAR
abcdef

我不明白为什么会发生#3

#3
$ unset SOME_VAR
$ SOME_VAR=abcdef   ./test.sh # prints abcdef 
abcdef

我认为发生#4的原因是,shell脚本的赋值和执行是在父shell中作为两个不同的命令执行的,而在test.sh中执行命令的子shell不会继承SOME_VAR(因为没有export语句)。

#4
$ unset SOME_VAR
$ SOME_VAR=abcdef   ; ./test.sh # prints nothing

test.sh包含:

$ cat test.sh
#!/bin/bash

echo $SOME_VAR

1 个答案:

答案 0 :(得分:2)

发生示例1是因为变量扩展首先发生。在这种情况下,事件的顺序为:

  1. 展开$SOME_VAR(到一个空字符串)
  2. SOME_VAR设置为abcdef
  3. 调用echo(没有参数,因为$SOME_VAR扩展为空字符串)

正如您所说,示例2的发生是因为命令是分别运行的。

发生示例3是因为在调用SOME_VAR之前abcdef被设置为./test.sh,并且它是运行./test.sh的环境的一部分。这实际上是目的成语VAR=value command的形式。您希望command能够使用VAR,但不一定要让其他命令或子Shell都能看到它。

之所以发生示例4,是因为SOME_VAR是当前shell中的局部变量,并且尚未进行export编辑,以便子shell可以使用它。

示例5将是:

unset SOME_VAR
export SOME_VAR=abcdef ; ./test.sh # prints abcdef
相关问题