2016-12-28 57 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