一重引用符でパラメータを使用する方法

一重引用符でパラメータを使用する方法

IDを含むファイルがあります。

123abc
456dbc

ファイルを繰り返しながらコマンドに渡したいです。

現在私のコマンドは次のように動作します。part_of_command '{"id":{"S":"123abc"}}'しかし、今ファイルがあるので、123abcをファイルの各行の内容に置き換えたいと思います。

私は似たようなことを達成しようとしています。

    while read line; do
   command '{"id":{"S":"$line"}}'
    done <output.txt

ここで、行は 123abc、456dbc、またはその他の ID です。ただし、$ lineは一重引用符と二重引用符エラーを発生させます。この問題を解決する方法を知っていますか?

ベストアンサー1

ネストされたJSONオブジェクトをコマンドにパラメータとして渡したいようです。シェルは一重引用符内に変数を拡張しません。

しかし、ここで回避策は二重引用符を代わりに使用しないことです。これは、JSON文書に挿入されたデータを有効なJSONでエンコードする必要があるためです(タブ、引用符、または書式を破る他の文字が含まれている場合)。

JSONを生成するための2つの素晴らしいツールがあります。最も簡単な使い方は次のとおりですjo

while IFS= read -r line; do
    utility "$( jo id="$( jo S="$line" )" )"
done <input.txt

もう一つは次のとおりjqです。

while IFS= read -r line; do
    utility "$( jq -c --arg data "$line" -n '{ id: { S: $data } }' )"
done <input.txt

両方のループは、読み取ったデータ(JSONエンコーディングである可能性があります)でネストされたJSONオブジェクトを正しく作成し、そのutilityオブジェクトをパラメータとしてユーティリティを呼び出します。

を使用すると、jqループを反転して繰り返すjqたびに呼び出されるのを防ぐこともできます。これを行うには、出力結果セットの各要素が行(「単純な出力」)になるように-cする using が必要です。jq

jq -c -R '{ id: { S: . } }' input.txt |
while IFS= read -r json; do
    utility "$json"
done

...またはコマンドを生成するようにしてくださいeval

eval "$(
   jq -r -R '[ "utility", ({ id: { S: . } } | @json) ] | @sh' input.txt
)"

output.txt質問から読み取ったファイルを呼び出しているので、これを生成するいくつかのワークフローステップがあるかもしれません。utility実行している操作に応じて、以前の呼び出しをパイプラインに統合したり、完全にバイパスしたりできます。特にIDが一部のJSONドキュメントから出てくる場合。

おすすめ記事