2016-04-26 24 views
1

長い配列から与えられたデータを引数として使って複雑なbashコマンドを実行したいと思います。私はそれが何らかの形でサブシェルを使用しなければならないと思う。例えば配列から与えられたコマンドライン引数

、代わりに実行可能な 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は引数のinstedコマンドとして解釈されます。

「i in ... ... do convert ... $ i ...; done」は機能しませんのでご注意ください。 -draw "point x,y"一連の引数は、convertが既存のイメージで-drawパラメータを受け入れないため、同じ単一実行変換コマンド内になければなりません。

+0

埋め込み 'for'ループから' -draw ... '文字列を' echo'/'printf'する必要があります。 –

+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はそれをファイル名として認識し、 '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 "point 1,1" '単一の引数であり、' covert'が期待する '-draw'と' point 1,1'の2つの引数ではありません。 – chepner

0

あなたはこのようstdinを表すダッシュに続く@ファイル指定子を使用することによって、そのstdin経由convertに描画コマンドをMVGをポンピングすることによって、あなたのコマンドラインを短くし、清潔に保つことができます。

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 
関連する問題