我有这样的事情:

projectName= echo $tempPBXProjFilePath | sed "s/.*\/\(.*\)\.xcodeproj.*$/\1/g";

我想从$tempPBXProjFilePath提取子字符串。这是正确的。但是,如果我这样写:
projectName=echo $tempPBXProjFilePath | sed "s/.*\/\(.*\)\.xcodeproj.*$/\1/g";

这是错误的。区别在于变量后的空白。

我知道直接在变量后没有空格。但是等号后的空白是什么意思。在空白处有特殊含义的地方吗?

最佳答案

变量分配

variable assignment的语法为:

name=value

注意,=符号周围没有空格。如果值包含空格或特殊字符,则应使用单引号将其引起来:
name='value with spaces or special characters'

variable expansion用双引号括起来:
name="stringA $variable stringB"

如果缺少引号,则将值部分中的第二个单词解释为命令。实际上,这是一种将环境变量传递给命令的方法(请参见下文)。

如果缺少该值,则会创建一个具有空值的变量。

环境变量

还有另一种语法可以为命令分配环境变量:
nameA=valueA nameB=valueB nameC=valueC command arguments

名称/值对之间用空格字符分隔。

示例
LD_PRELOAD=/path/to/my/malloc.so /bin/ls

该命令在调用LD_PRELOAD之前将/path/to/my/malloc.so环境变量分配给/bin/ls

您的命令

因此,您的命令:
projectName= echo $tempPBXProjFilePath

实际上意味着您从echo调用了带有expanded参数的$tempPBXProjFilePath命令,并将projectName环境变量设置为空值。

而这个命令:
projectName=echo $tempPBXProjFilePath

projectName环境变量设置为echo字符串,并调用从$tempPBXProjFilePath变量扩展的命令。

请注意,如果变量没有用双引号引起来,则shell会解释其值中出现的特殊字符。为了防止重新解释特殊字符,应使用弱引用:"$variable"。而且,如果要防止字符串值中的变量扩展,请使用单引号:'some value'

10-01 12:58