[jq] --argjson でシェル変数を JSON の値として渡す

作成日: 2026年10月24日

jq の --argjson オプションを使用すると、シェル変数に入った JSON テキストを数値や配列などの型を保ったまま jq のフィルター内で利用できます。

下記の例では、数値の shell_count と JSON 配列の shell_tags を渡し、JSON のプロパティに設定します。

shell_count=3
shell_tags='["linux","jq"]'
printf '%s\n' '{}' | jq \
  --argjson count "$shell_count" \
  --argjson tags "$shell_tags" \
  '.count = $count | .tags = $tags'

実行結果は下記のとおりです。

{
  "count": 3,
  "tags": [
    "linux",
    "jq"
  ]
}

説明

  • --argjson count "$shell_count" は、3 を JSON の数値として jq の変数 $count に渡します。
  • --argjson tags "$shell_tags" は、JSON 配列を jq の変数 $tags に渡します。
  • .count = $count | .tags = $tags は、入力オブジェクトに count と tags のプロパティを設定します。

--arg では渡す値が文字列になりますが、--argjson では値を JSON として解釈します。例えば、3 は数値、["linux","jq"] は配列として扱われます。

--argjson に渡す値は有効な JSON である必要があります。文字列を渡す場合は JSON の二重引用符も含める必要があるため、通常の文字列なら --arg が簡単です。

参考

jq