2011-09-16 65 views
0

我有一個bash腳本,我試圖將帶引號的值的posix樣式參數傳遞給另一個在其中調用的腳本。在命令行我可以鍵入:在bash中傳遞帶引號的Posix參數值

somescript --foo="bar baz" 

這意味着與具有鍵foo參數,該值是bar baz。在somescript,你可能會認爲這會工作:

innerscript "[email protected]" 

然而,這種重新報價每一個參數的全部,key和值分塊在一起,而不僅僅是值。因此Innerscript收到"--foo=bar baz",並且認爲您試圖將名爲foo=bar baz的密鑰與空值一起傳遞。

這不足以告訴bash「重新引用所有傳入的參數」。我需要告訴bash「重新引用所有在參數中傳遞的完全如何在之前引用它們」。不要改變我的引用位置,兄弟!

回答

3

問題出在innerscript那麼。之間沒有區別:

innerscript --foo="bar baz" 
innerscript "--foo=bar baz" 
innerscript --foo=bar\ baz 
innerscript --foo=bar' 'baz 

或毫無疑問,一些其他的替代品。在innerscript內,$1(在shell符號中)僅包含13個字符:--foo=bar baz。順便提一句,這同樣適用於somescript;當你如圖所示調用它時,它看不到雙引號。它們由shell處理(並由其移除)。

看到這一點,嘗試:

echo --foo="bar baz" 
+0

問題是我innerscript的理解。你是對的。它沒有完全的位置獨立選項,就像我認爲的那樣。 –

1

你不能那樣做。

腳本接收參數。當外殼解析該行時,它將第一個參數傳遞爲: 「--foo = bar baz」。你無法做任何事情來阻止這一點。但我不明白爲什麼會造成任何問題,您可以根據=分割參數。

# function test { echo $1; } 
# test a"b""c"'d'\e 
abcde 
0

爲了解析參數和選項使用getopt命令。

注1:getopt(gnu命令)增強getopts(在POSIX中定義)。

注2:--long-options是GNU風格,POSIX不

+0

請參閱[在bash腳本中使用getopts以獲取長命令行和短命令行選項](http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get-long-and-短的命令行選項/ 402413#402413)。 –