2012-02-28 74 views
10

我試圖用一個字符串變量(包含多個帶引號的單詞)作爲命令的參數。如何將引用的多字字符串替換爲參數?

因此,給定以下示例腳本(注意在認領,這導致要記錄到stderr輸出的-x),

#!/bin/bash -x 

myArg="\"hello\" \"world\"" 
echo "string is:" $myArg 

exit 

這使我們,

+ myArg='"hello" "world"' 
+ echo 'string is:' '"hello"' '"world"' 
string is: "hello" "world" 
+ exit 


第二行顯示實際傳遞給命令的內容; bash已將單引號添加到字符串中的每個單詞。如果我反而引用「$ myArg」,那麼對於整個字符串而不是每個字都會發生同樣的情況。

現在,設想一下,我們將字符串傳遞給程序,其中一些參數需要引用模式,例如"*"(不能由shell擴展),而不是echo

爲了澄清,我不想擴張過程中添加的所有單引號。我怎麼能做到這一點?

+0

你在做什麼?除非你用'eval'做了一件壞事,否則傳遞給程序的字符串是否包含'「*」'或'*'應該不重要。 – Sorpigal 2012-02-28 15:25:07

+0

對於任何一個感到困惑的人:請注意shebang中的'-x',它會導致輸出被記錄。 – user123444555621 2012-02-28 15:39:01

+0

@ Pumbaa80,的確,我已經補充說明了這個問題。 – 2012-02-28 15:50:53

回答

13

不要使用引號,使用數組(見BashFAQ #050):

$ myArgs=("hello" "world" "multiword arg with * ?") 
+ myArgs=("hello" "world" "multiword arg with * ?") 
$ echo "${myArgs[@]}" 
+ echo hello world 'multiword arg with * ?' 
hello world multiword arg with * ? 

如果真的需要在字符串中帶引號的字符串的形式,你要麼將不得不使用像eval "echo $myArg"(這可能會導致一些非常討厭的錯誤,如果你不小心),或自己解析它(這將是困難的)。

+0

這個數組方法完美地工作,非常感謝! ps。來自子shell的任何打印操作都由父shell解釋,所以任何這樣的'eval'語句似乎給出了同樣的不好結果。 – 2012-02-28 17:02:20

4

如果你想傳遞一個變量值作爲參數(在SO病例99%),只需使用正確quoting

arg="foo bar" 
command "$arg" 

如果你想傳遞一些參數,使用數組:

args=("foo bar" "baz ban" bay) 
command "${args[@]}" 
+0

正如通過澄清@ gordon-davisson,陣列確實是答案,非常感謝! – 2012-02-28 17:12:47

0

我不認爲這是做什麼你認爲它在做什麼。

[~]$ myArg="\"hello\" \"world\"" 
[~]$ echo "string is:" $myArg 
string is: "hello" "world" 

我看到的任何kind- echo沒有多餘的報價獲得以上三個參數字符串。

[~]$ cargs(){ echo $#; } 
[~]$ cargs "string is:" $myArg 
3 

bash將首先擴展變量,所以

cargs "string is:" $myArg 

變爲(雖然沒有字面backslashes-這就是爲什麼串逸出是PITA)

cargs "string is:" "\"hello\"" "\"world\"" 

而args數組是:

0x00:string is:0 
0x0B:"hello"0 
0x13:"world"0 
0x1B:0 

現在,如果你添加這些之一*,或水珠路徑擴展,bash將在這一點上展開它,除非你逃避它,或者在你的文字命令使用單引號。

[~]$ cargs "string is:" $myArg * 
19 
[~]$ cargs "string is:" $myArg "\*" 
4 
[~]$ cargs "string is:" $myArg '*' 
4 
+0

Echo's * output *實際上完全打印了引用的單詞,但傳遞給echo的輸入參數(如問題中調試輸出的第二行所示)是單引號雙引號('「str」'),遺憾的是對於我正在使用的工具而言是無意義的輸入。 – 2012-02-28 17:08:59

相關問題