想验证我对这些情况为何表现不同的理解:
我认为发生#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
发生示例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是因为它是当前外壳程序中的局部变量,并且尚未被export-ed以便子外壳程序可以使用它。
然后,示例5将是:
unset SOME_VAR
export SOME_VAR=abcdef ; ./test.sh # prints abcdef
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。