空白が改行のようにエコーされるのはなぜですか?

空白が改行のようにエコーされるのはなぜですか?

私が得たJSONデータは次のとおりです。

[
  {
    "loginId": "7638749",
    "customerprofileDetails": {
      "securityQuestions": [
        "What is your favorite sports team?",
        "What is your favorite song?",
        "Who is your favorite artist?"
      ]
    }
  }
]

このファイルを最初のパラメータとして渡すスクリプトがあります。スクリプトは次のとおりです。

for json in `cat $PWD/$1 | jq -cr '.[]'` ; do
    echo "$json"
done

何らかの理由でこのスクリプトを実行すると、次のものが出力されます。

> fileFromJson.sh tmp2.json
{"loginId":"7638749","customerprofileDetails":{"securityQuestions":["What
is
your
favorite
sports
team?","What
is
your
favorite
song?","Who
is
your
favorite
artist?"]}}

これらの改行文字があるのはなぜですか。この問題の原因は何ですか?ただ実行すると、cat $PWD/tmp2.json | jq -cr '.[]'1行が印刷されます。これが重要な場合は、私はMacOSを使用しています。

ベストアンサー1

引用符なしでコマンドを置き換えると、`cat $PWD/$1 | jq -cr '.[]'`次のことが行われます。

  1. コマンドを実行してくださいcat $PWD/$1 | jq -cr '.[]'。ちなみに、jq -cr '.[]' <"$1"この変形が壊れないことを除いて、これは作成する方法が複雑すぎます。$1特定の特殊文字が含まれている場合または絶対パスです。
  2. 結果文字列をスペースで区切られたセグメントに分割します。あなたの質問は明確ではありませんが、改行で区切られたセクションを期待しているようです。これは引用されていない代替機能ではありません。
  3. 各部分をワイルドカードパターンとして扱い、1つ以上のファイル名と一致する場合は、その部分を一致するファイル名のリストに置き換えます。

ステップ2と3は、口語的に「split + glob演算子」として知られています。これはあなたが望むことはほとんどありません引用符を省略する理由を正確に知らない限り、変数とコマンドの置換には常に二重引用符を使用してください。

シェルでファイルを1行ずつ処理するには、次のようにします。while readリング:

jq -cr '.[]' <"$1" |
  while IFS= read -r line; do
    printf '%s\n' "$line"
  done

しかし、他のツールを使用する方が良いです。シェル自体は、大量の文字列データを処理するのには適していません。

おすすめ記事