(=)符号后有空格的变量赋值?

Posted

技术标签:

【中文标题】(=)符号后有空格的变量赋值?【英文标题】:Assignment of variables with space after the (=) sign? 【发布时间】:2015-01-14 07:45:42 【问题描述】:

在 Bash 中,为变量赋值是使用 T=content 完成的,等号前后没有空格。

尽管我在 shell 脚本PWD= /bin/pwd 中看到了以下内容,等号右侧包含一个空格。

它有空格的目的是什么?

【问题讨论】:

您是否运行了脚本并查看了 PWD 的内容?它将是空的,当您运行脚本时,您会看到打印的当前工作目录? 【参考方案1】:

在示例PWD= /bin/pwd 中,变量PWD 在执行命令/bin/pwd 之前设置为空字符串。更改仅对该行生效。

这对于为了运行命令而对变量进行临时更改很有用,而不会影响原始值。另一个例子是使用read,设置不同的IFS

IFS=, read a b c <<<"comma,separated,list"

这会将字段分隔符设置为逗号,以便正确读取 abc。此行之后,IFS 将返回默认值,因此脚本的其余部分不受影响。

也许在某些系统上,命令pwd 的输出会受到变量PWD 的值的影响,因此这样做可以防止PWD 在其他地方被覆盖所导致的问题。

【讨论】:

也许这是针对 bash 兼容性以外的不同外壳?这是作者的解释:# The following circumlocution (repeated below as well) ensures that we record the true directory name and not one that is faked up with symlink names. 是的,从那条评论看来,$PWD 在某些情况下可能被分配了不正确的值,pwd 会在设置后读取此值,而不是计算出真实路径,在其他一些 shell 上。 密码未设置。它被明确设置为空字符串。它们是有区别的。例如,考虑$FOO-bar$FOO:-bar 之间的区别。【参考方案2】:

我们在这里不是在谈论两个不同的东西。

如果我们有

PWD=/bin/pwd

我们会将/bin/pwd 分配给PWD

但是

PWD= /bin/pwd

表示我们调用/bin/pwd 并将PWD 设置为空字符串。这个赋值只影响子进程,不影响当前进程。

【讨论】:

【参考方案3】:
PWD= pwd

此语法在pwd 命令的持续时间内将空值分配给变量PWD

PWD=ick
echo "$PWD"

这会将PWD 分配给脚本的其余部分。

PWD=ick pwd
echo "$PWD"

这仅在pwd 命令的持续时间内分配PWDecho 将回显在 pwd 调用之前和之后有效的值。

PWD=

这只是将空值分配给PWD

病理学上,

PWD = ick

尝试使用参数=ick 运行命令PWD

【讨论】:

不管PWD 的值如何,Bash 的pwd 命令都会报告当前目录。 顺便说一句,硬编码/bin/pwd 通常不是必需的,而且可能是个坏主意。脚本应该相信用户有一个理智的PATH,并允许他们在某些情况下覆盖系统命令(测试脚本中的模拟命令是一种常见的场景)。当然,在这里,您可能希望确保绕过任何 shell 内置命令 pwd 以支持外部二进制文件?但在一般情况下,我会劝阻不要这样做。【参考方案4】:

当 bash 或大多数其他 shell 看到以下行时:

PWD= /bin/pwd

shell 从左到右解析命令行。它将命令行分解为两个字段:PWD=/bin/pwd,因为它们被不带引号的空格分隔。当它返回解析第一个字段 PWD= 时,它会找到一个未加引号的 = ,因此,shell 将其视为变量赋值/初始化。它认为PWD 是变量名,紧跟在= 符号之后的任何字符串,直到空格都是变量值。在这种情况下,它将是一个空字符串,因为 = 符号后只有一个空格,而未加引号的空格是 shell 中的参数分隔符。因此,PWD 的值将是 ''(空字符串),顺便说一下,这只会影响其他人提到的直接命令 /bin/pwd。

如果 = 之前也有空格,那么 shell 总共会看到 3 个字段

PWD = /bin/pwd

Shell 将通过在 PATH 位置中搜索将第一个字段 PWD 视为别名或函数或命令。它将其他两个字段 =/bin/pwd 视为第一个命令或函数的参数

【讨论】:

以上是关于(=)符号后有空格的变量赋值?的主要内容,如果未能解决你的问题,请参考以下文章

linux-shell编程-2-变量概述

linux-shell编程-2-变量概述

vba编程 变量赋值单元格

linux 变量环境变量

linux 变量环境变量

Shell 变量