我有这样的事情:
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'
。