[英]Assignment of variables with space after the (=) sign?
在 Bash 中,为变量赋值是使用T=content
,等号前后没有空格。
尽管如此,我在 shell 脚本PWD= /bin/pwd
中看到了以下内容,其中包含等号右侧的空格。
它有一个空间的目的是什么?
在示例PWD= /bin/pwd
,变量PWD
在执行命令/bin/pwd
之前被设置为空字符串。 更改仅对该行生效。
这对于出于运行命令的目的对变量进行临时更改非常有用,而不会影响原始值。 另一个例子是使用read
来设置不同的IFS
:
IFS=, read a b c <<<"comma,separated,list"
这将字段分隔符设置为逗号,以便正确读取a
、 b
和c
。 在此行之后, IFS
返回到默认值,因此脚本的其余部分不受影响。
也许在某些系统上,命令pwd
的输出受变量PWD
的值的影响,因此这样做可以防止PWD
在其他地方被覆盖而导致的问题。
我们在这里不是在谈论两种不同的事情。
如果我们有
PWD=/bin/pwd
我们会将/bin/pwd
分配给PWD
。
但
PWD= /bin/pwd
意味着我们调用/bin/pwd
并将PWD
设置为空字符串。 此分配仅影响子进程,而不影响当前子进程。
PWD= pwd
此语法在pwd
命令的持续时间内将空值分配给变量PWD
。
PWD=ick
echo "$PWD"
这将为脚本的其余部分分配PWD
。
PWD=ick pwd
echo "$PWD"
这仅在pwd
命令的持续时间内分配PWD
; echo
将回显在pwd
调用之前和之后生效的值。
PWD=
这只是将空值分配给PWD
。
病理上,
PWD = ick
尝试使用参数=
和ick
运行命令PWD
当 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
视为第一个命令或函数的参数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.