"mogrify"ツールで使用するコマンドラインを作成しています。 [セクションイメージマジック]。最終的なコマンドラインは次のとおりです。
mogrify -stroke yellow -draw 'line 0,0 0,319' -draw 'line 125,0 125,319' -draw 'line 652,0 652,319' file.png
コマンドを実行する前にコマンドをエコーします。このエコーラインを作成したように、新しいコマンドでシェルにコピー/貼り付けると完璧に動作します。
しかし、スクリプトでは機能しません。何らかの理由で名前などのmogrify
ファイルを探しています。明らかに、引数文字列を周囲に一重引用符がないかのように解釈します。0,0
0,319
mogrify
draw
[つまり、エラーが発生したスクリプトの行]に与えられた最後のコマンドは次のようになります。
mogrify -stroke $C3 $args $FILE
私は繰り返し文字列を整理します$args
。最後の文字列の結果は、私がこの質問の上部近くに置いたことです。
バックスラッシュを使用して一重引用符をエスケープし、二重引用符を使用して一重引用符を二重エスケープし、構成ループで一重引用符と二重引用符を交換しました。私も$args
それを二重引用符で囲みようとしました。各パラメータを配列に入れてから、最後の呼び出しで${args[@]}
[上記の$args
場所]を試しました。私が試したことは何も機能しませんでした。
[編集 - 配列スタイル呼び出しに関する詳細情報の表示]
配列呼び出しのために、次のように配列を準備します。
data="99.8734 351.645 1836.05"
for p in $data; do
x=$(echo "$W * $p / $duration" | bc)
args+=(-draw "'line $x,$y1 $x,$y2'")
done
[注:$ dataは実際に外部ソースから取得されますが、この質問の目的のためにここに文字通りデータポイントを割り当てます。 ]
配列呼び出しを使用してmogrifyを呼び出すと、スクリプトは次のコマンドを実行します。
mogrify -stroke $C3 "${args[@]}" $FILE
この場合、空白もなく$C3
空白$FILE
もありません。
上記のエラーは次のとおりです。
mogrify: non-conforming drawing primitive definition 'line 35,0 35,320' @ error/draw.c/RenderMVGContent/4271
これで配列の割り当てが正しく機能しているように見えますが、シェルがロードされていますmogrify
。
正しいコマンドラインをエコーすると、次のようになります。
mogrify -stroke yellow -draw 'line 35,0 35,319' -draw 'line 125,0 125,319' -draw 'line 652,0 652,319' file.png
興味深いことに、配列の割り当てを次のように変更すると、二重引用符が行定義だけでなく項目全体に移動されました。
args+=("-draw 'line $x,$y1 $x,$y2'")
...その後、mogrifyで次のエラーが発生しました。
mogrify: unrecognized option '-draw 'line 35,0 35,319'' @ error/mogrify.c/MogrifyImageCommand/4716
エラー出力には、以前は含まれていなかった行定義の周りに配置された一重引用符が正しく含まれます。これは一重引用符もエスケープしようと考えましたが、'\''
それも機能しませんでした。一重引用符と二重引用符を反転することも、[内部全体で変数の拡張を許可]しません。
ベストアンサー1
二重引用符(または一重引用符)は、シェルがその中のテキストの処理を停止するために使用されます。コマンド自体の一部として追加することはできません。
しかし、できることは、配列ビルドコマンドを使用してから、その配列変数を結果に含めることです。ここではargs
、スカラー(文字列)の代わりに配列変数を使用して、リストに引用された値を繰り返し追加できます。
C3=yellow
FILE=file.png
args=()
args+=(-draw 'line 0,0 0,319')
args+=(-draw 'line 125,0 125,319')
args+=(-draw 'line 652,0 652,319')
または
args+=(-draw "line $x,$y1 $x,$y2")
リテラル数の代わりに変数を使用する場合。特に、更新された質問に表示される一重引用符が正しくないことに注意してくださいargs+=(-draw "'line $x,$y1 $x,$y2'")
。価値)に渡されますmogrify
。
args
最後に、シェルが各要素を引用符で囲んだ値として扱うように、値セットを二重引用符で囲みます。
mogrify -stroke "$C3" "${args[@]}" "$FILE"