(=)符号后有空格的变量赋值?
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"
这会将字段分隔符设置为逗号,以便正确读取 a
、b
和 c
。此行之后,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
命令的持续时间内分配PWD
; echo
将回显在 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
视为第一个命令或函数的参数
【讨论】:
以上是关于(=)符号后有空格的变量赋值?的主要内容,如果未能解决你的问题,请参考以下文章