环境变量中单引号和双引号的意义是什么?

2Ni*_*meo 26 shell environment-variables quoting

我在我的 .profile 中定义了一些环境变量,如下所示:

MY_HOME="/home/my_user"
Run Code Online (Sandbox Code Playgroud)

但是除非我去掉引号并重新获取文件,否则变量似乎不会评估。如果有空格,我相信引号是必要的,如果不需要转义,则使用单引号。有人可以澄清变量定义中单引号和双引号的重要性吗?前勾和后勾怎么样?

Bru*_*ger 27

我认为您对术语感到困惑。

“环境变量”只是任何子进程都将继承的 shell 变量。

您在示例中所做的是创建一个 shell 变量。在您导出它之前,它不在环境中:

MY_HOME="/home/my_user"
export MY_HOME
Run Code Online (Sandbox Code Playgroud)

在几乎所有的 shell(csh、tcsh 除外)中放置一个名为“MY_HOME”的变量。

在这种特殊情况下,双引号是多余的。它们没有效果。双引号将子字符串分组,但允许您使用任何 shell 进行变量替换。单引号将子字符串分组并防止替换。由于您的示例赋值中没有任何变量,因此双引号可能显示为单引号。

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment
Run Code Online (Sandbox Code Playgroud)

在您导出环境之前,环境中没有任何内容。


Gil*_*il' 21

Shell 变量与环境变量

MY_HOME="/home/my_user"设置shell变量叫MY_HOME。Shell 是编程语言,并且具有变量(也称为参数)。在此赋值之后,您可以使用变量的值,例如使用echo "$MY_HOME".

Shell 变量是一个内部的 Shell 概念。当那个 shell 实例终止时,MY_HOME就被遗忘了。每个程序都知道并传递给它的孩子的是环境变量。

在 shell 内部,环境变量和 shell 变量的工作方式非常相似。实际发生的是,shell 从其父级继承的所有环境变量都变成了 shell 变量。相反,如果您导出在 shell 脚本中定义的 shell 变量,它将成为环境变量。

export MY_HOME="/home/my_user"
Run Code Online (Sandbox Code Playgroud)

更多细节你可以在第一次阅读时跳过

shell 变量不会自动成为环境变量的部分原因是脚本可能不小心使用了对其启动的程序有意义的变量名称,部分原因是历史变量。

export每次更改变量名称时都需要使用一些非常旧的 shell ,但所有现代 shell 都会跟踪环境变量的分配,因此以下代码片段会回显bar:

myvar=foo
export myvar
myvar=bar
env | grep '^myvar='
Run Code Online (Sandbox Code Playgroud)

此外,一些非常旧的 shell 需要单独的命令myvar=foo和export myvar,但所有现代 shell 都能理解export myvar=foo.

您可以运行set -a以使所有 shell 变量分配自动导出变量,因此这myvar=foo相当于export myvar=foo您set -a首先在该 shell 中运行。

在引用

引用大多是正交的。如果您分配给变量的值不包含任何 shell 特有的字符,则不需要任何引号。如果有特殊字符,则需要使用单引号或双引号或反斜杠或其组合来保护它们。这适用于普通myvar=value语法和export实用程序。

赋值语法和export语法之间有一个区别。shell$foo进一步扩展变量替换的结果,执行字段(词)拆分和路径名扩展(通配)。这意味着如果值为myvaris hello ? *,则echo $myvar打印hello后跟一个空格,后跟当前目录中的文件列表。这是几乎从来没有希望,因此总的原则要始终在用变量替换双引号(除非你知道你需要在路径名扩展或场分裂)echo "$myvar"。在简单赋值的情况下,othervar=$myvar实际上可靠地复制myvarto的值othervar,因为在赋值中禁止通配符和分词(因为它们会创建多个单词,但预期只有一个单词)。但是,此豁免不适用于export。因此,如果您想记住一个简单的规则,请始终在变量替换周围使用双引号。

  • @DKBose这意味着一方面环境与shell变量,另一方面是引用,是两个彼此无关的独立问题。[维基词典](http://en.wiktionary.org/wiki/orthogonal) 含义 4 和 5。 (2认同)