スクリプトで引用符をエスケープする問題

スクリプトで引用符をエスケープする問題

"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,00,319mogrifydraw

[つまり、エラーが発生したスクリプトの行]に与えられた最後のコマンドは次のようになります。

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"

おすすめ記事