2016-04-26 86 views
1

我想執行一個複雜的bash命令,使用從一個long數組提供的數據作爲參數。我想它必須以某種方式使用子shell。從一個數組提供的命令行參數

例如,而不是可行的 convert -size 100x100 xc:black -fill white -draw "point 1,1" -draw "point 4,8" -draw "point 87,34" etc etc etc image.png

我想使用不同的邏輯,其中所述參數是在相同的給定命令,更像是

convert -size 100x100 xc:black -fill white $(for i in 1,1 4,8 87,34 etc etc; -draw "point $i"; done) image.png 其不工作,因爲$ i被解釋爲一個由參數構成的命令。

請注意,「我在...中;轉換... $ i ...; done」將不起作用。 -draw "point x,y"系列參數必須位於同一個單一運行轉換命令中,因爲convert不接受現有圖像中的-draw參數。

+0

您需要從嵌入式for循環'echo' /'printf''-draw ...'字符串。 –

+0

我的回答或任何其他問題是否解決了您的問題?如果是這樣,請考慮接受它作爲您的答案 - 通過點擊投票計數旁邊的空心綠色勾號/複選標記。如果沒有,請說出什麼不起作用,以便我或其他人可以進一步幫助您。謝謝。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

回答

3

樹立的-draw參數數組第一。

for pt in 1,1 4,8 87,34; do 
    points+=(-draw "point $pt") 
done 
convert -size 100x100 xc:black -fill white "${points[@]}" image.png 
-1

如何使用printf來擴大內容?

points=(1,1 4,8 87,34) 
printf -- '-draw "point %s" ' ${points[@]} 

(末尾沒有新行)返回以下字符串:

-draw "point 1,1" -draw "point 4,8" -draw "point 87,34" 

你可以說:

points=(1,1 4,8 87,34) 
convert ... "$(printf -- '-draw "point %s" ' ${points[@]})" image.png 
#   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

這樣,你存儲點的數組和printf「傳遞」給convert命令。

+0

謝謝,但是,語法是'-draw'點x,y「'帶短劃線。當我嘗試'printf'-draw ...''printf將它識別爲-d選項並返回一個錯誤。我嘗試用'printf'語法解決它...''然後,我不知道爲什麼,轉換將它識別爲文件名並返回'convert:無法打開圖像'-draw'點等等'' – Voprosnik

+0

@Voprosnik避免'printf'理解'-d'作爲一個選項是在它後面加上'--',所以它知道沒有更多的參數被給出 - >'printf - '-draw「point%s」'$ {points [@]}' – fedorqui

-1

嘗試使用膨脹,而不是亞殼是這樣的:

echo -draw\ \"point\ {1\,1,2\,2,3\,3}\" 

產生這樣的輸出:

-draw "point 1,1" -draw "point 2,2" -draw "point 3,3" 
+0

這使得' -draw「指向1,1」一個參數,而不是兩個單獨的參數'-draw'和''1,1'''covert'將會期望的。 – chepner

0

你可以把你的命令行短期和清潔通過使用@文件說明符隨後是代表stdin這樣一個破折號通過其stdin抽MVG繪圖命令爲convert

for i in 1,1 4,8 87,34; do 
    echo point $i 
done | convert -size 100x100 xc:red -draw @- result.png 

enter image description here

如果您有一個名爲 points的數組:
points=(1,1 4,8 87,34) 

printf "point %s\n" ${points[@]} | convert -size 100x100 xc:red -draw @- result.png