Linux 为什么';t'';var=值echo$var'';发射值?
想验证我对这些情况为何表现不同的理解: 我认为发生#1是因为赋值和echo在shell中作为单个命令运行,并且在echo执行时未设置$SOME_VAR(shell在执行之前展开所有变量) 我认为发生#2是因为赋值和echo在同一个shell中作为两个单独的命令运行,并且在执行echo时在shell中设置了$SOME_VARLinux 为什么';t'';var=值echo$var'';发射值?,linux,bash,shell,Linux,Bash,Shell,想验证我对这些情况为何表现不同的理解: 我认为发生#1是因为赋值和echo在shell中作为单个命令运行,并且在echo执行时未设置$SOME_VAR(shell在执行之前展开所有变量) 我认为发生#2是因为赋值和echo在同一个shell中作为两个单独的命令运行,并且在执行echo时在shell中设置了$SOME_VAR #2 $ unset SOME_VAR $ SOME_VAR=abcdef ; echo $SOME_VAR abcdef 我不明白为什么会发生#3 #3 $ unse
#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不会继承一些#VAR(因为没有export语句)
test.sh包含:
$ cat test.sh
#!/bin/bash
echo $SOME_VAR
示例1之所以发生,是因为变量展开首先发生。在这种情况下,事件的顺序是:
$SOME\u VAR
(到空字符串)SOME_VAR
设置为abcdef
echo
(没有参数,因为$SOME\u VAR
扩展为空字符串)/test.sh
之前,某些变量设置为abcdef
,并且是运行/test.sh
的环境的一部分。这实际上就是成语VAR=value命令的目的。您希望command
能够使用VAR
,但不一定希望其他所有命令或子shell都能看到它
示例4之所以发生,是因为SOME_VAR
是当前shell中的一个局部变量,并且尚未export
-ed以便子shell可以使用它
示例5将是:
unset SOME_VAR
export SOME_VAR=abcdef ; ./test.sh # prints abcdef
要了解发生了什么,您可以查看脚本运行环境中有哪些可用变量;如果您将env | grep'SOME_VAR'
添加到test.sh
,您将看到有什么不同。大多数情况下,#3将SOME_VAR
添加到子流程的环境中,但#4没有。如果将#4更改为导出一些_VAR=abcdef/test.sh
,它将打印值。
$ cat test.sh
#!/bin/bash
echo $SOME_VAR
unset SOME_VAR
export SOME_VAR=abcdef ; ./test.sh # prints abcdef