想验证我对这些情况为何表现不同的理解:
我认为发生#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
答案 0 :(得分:2)
发生示例1是因为变量扩展首先发生。在这种情况下,事件的顺序为:
$SOME_VAR
(到一个空字符串)SOME_VAR
设置为abcdef
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