2016-12-28 23 views
5

我有这样的事情:空白在bash中的含义是什么?

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

我想从$tempPBXProjFilePath提取子。这是正确的。但是,如果我这样写:

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

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

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

回答

3

变量赋值

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 

命令调用/bin/ls之前LD_PRELOAD环境变量分配给。

你的命令

因此,你的命令:

projectName= echo $tempPBXProjFilePath 

实际上意味着你叫echo命令与参数expanded$tempPBXProjFilePath,并设置projectName环境变量为空值。

而这个命令:

projectName=echo $tempPBXProjFilePath 

projectName环境变量echo字符串,并呼吁从$tempPBXProjFilePath可变扩展的命令。

注意,如果一个变量没有用双引号括起来,那么它的值中出现的特殊字符将被shell解释。为了防止重新解释特殊字符,您应该使用弱引用:"$variable"。如果要防止字符串值中的变量扩展,请使用单引号:'some value'

+0

谢谢,这真的很有帮助。 – Tepmnthar

+0

伟大的总结,鲁斯兰!我为你的文章添加了更多内容。希望你喜欢。 – codeforester

2

Bash在每个空白处(空格或制表符)将每行分隔为单词。

它找到的第一个单词是要执行的命令的名称,其余的单词成为该命令的参数。

所以当你通过

projectName=echo 

庆典了解PROJECTNAME =回声作为一个变量赋值,并

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

的命令! (如指出由克里斯多德)在任

空白

插入空格或将值分配给一个变量将失败时等号(=)的两侧。

INCORRECT 1

example = Hello 

INCORRECT 2

example= Hello 

INCORRECT 3

example =Hello 

唯一有效的形式是变量名和指定值之间没有空格:

正确1

example=Hello 

CORRECT 2

example=" Hello" 

你可以看到更多的:

http://wiki.bash-hackers.org/scripting/newbie_traps

+1

实际上,'projectName ='或'projectName = echo'是一个变量赋值而不是命令名(第一个将'projectName'设置为空字符串)。你可以在一个命令的命令名之前有一个或多个变量赋值 - 命令名是第一个不包含'='的词。 –

+1

谢谢你今天和昨天的回答。对不起,我不选择这个,虽然它对我很有帮助。真的很难决定哪个答案更好。 – Tepmnthar