2016-06-19 31 views
2

以下代碼回聲一個引述陣列引

myopts=(--url="http://www.lemonde.fr" --out="hello world" --out-format="png") 
echo "going to execute following command: cutycapt ${myopts[@]}" 
# commented out because this way you do not have to have cutycapt to test 
# cutycapt "${myopts[@]}" 

輸出以下:

going to execute following command: cutycapt --url=http://www.lemonde.fr --out=hello world --out-format=png 

但實際上什麼被執行爲:

cutycapt --url="http://www.lemonde.fr" --out="hello world" --out-format="png" 

因此,這就是我想要從echo命令輸出。

回答

2

您可以使用printf%q格式字符串打印的參數的引用版本一樣

printf '%q ' cutycapt "${myopts[@]}"; printf '\n' 

(我們添加我們\n以來printf年底好好嘗試一下自動加一)

例如:

$ myopts=(--url="http://www.lemonde.fr" --out="hello world" --out-format="png") 
$ printf 'going to execute following command: '; printf '%q ' cutycapt "${myopts[@]}"; printf '\n' 
going to execute following command: cutycapt --url=http://www.lemonde.fr --out=hello\ world --out-format=png 

隨着空間的逃脫hello world

根據您爲什麼要這樣做,您是否考慮過僅在啓用set -x的情況下運行,因此無論如何您都會看到擴展的命令行?

$ set -x 
$ cutycapt "${myopts[@]}" 
+ cutycapt --url=http://www.lemonde.fr '--out=hello world' --out-format=png 
3

當你創建你的數組時,它的元素會被引用移除。如果你想留住他們,你必須增加他們已經援引:

$ myopts=('--url="http://www.lemonde.fr"' '--out="hello world"' '--out-format="png"') 
$ echo "going to execute following command: cutycapt ${myopts[@]}" 
going to execute following command: cutycapt --url="http://www.lemonde.fr" --out="hello world" --out-format="png" 

如果在創建myopts後,看看你的數組元素,你會看到他們已經錯過了報價:

$ myopts=(--url="http://www.lemonde.fr" --out="hello world" --out-format="png") 
$ (IFS=$'\n'; echo "${myopts[*]}") 
--url=http://www.lemonde.fr 
--out=hello world 
--out-format=png 

因此,它不是擴展,它將它們刪除–分配時發生。

+0

但是當我使用myopts時,'cutycapt $ {myopts [@]}'命令不起作用。我不想有兩個單獨的「myopts」,因爲我想減少重複。 –

+0

@XuWang如何實際調用它? 'cutycapt「$ {myopts [@]}」'(注意引號)? –

+0

對不起,引號是我稱呼它的方式。它不適合我。 –