在(=)符号后用空格分配变量?

时间:2014-11-17 11:45:28

标签: bash shell sh

在Bash中,使用T=content为变量赋值,在等号之前或之后没有空格。

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

它的目的是什么??

4 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:2)

PWD= pwd

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

PWD=ick
echo "$PWD"

这会为脚本的其余部分指定PWD

PWD=ick pwd
echo "$PWD"

仅在PWD命令的持续时间内分配pwd; echo将回显pwd调用之前和之后生效的值。

PWD=

这只是将空值分配给PWD

答案 2 :(得分:2)

我们不是在谈论两件不同的事情。

如果我们有

PWD=/bin/pwd

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

但是

PWD= /bin/pwd

表示我们调用/bin/pwd并将PWD设置为空字符串。此分配仅影响子流程,而不影响当前流程。

答案 3 :(得分:0)

当 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 视为第一个命令或函数的参数