シェルスクリプトでJSONと変数を使う方法

前提条件

  • 今回は、JSONを使ったシェルスクリプトで、JSON内に変数を組み込む方法をご紹介します。
  • 通常のシェルスクリプトのつもりで変数を組み込むとハマります。JOSNに指定する文字列は”(ダブルクォーテーション)で囲む必要がありますが、変数として組み込む場合に、“${var}” とすると変数が展開されないためです。
  • 以下スクリプトのサンプルで説明します。このサンプルを実行した結果、変数が展開されず、検索結果には何も表示されません。

スクリプトのサンプル

  • 以下はNGのサンプル例です。JSON内では、YESTD, TODAY の変数を指定していますが、これでは意図した結果になりません(awsコマンドの実行結果、何もヒットしません)。

$ TABLENAME=dynamo-table01
$ YESTD="20190801"
$ TODAY="20190802"
$ aws dynamodb scan --table-name ${TABLENAME} --filter-expression '#a >= :1 and #b < :2' --expression-attribute-values '{ ":1": { "S": "${YESTD}" }, ":2": { "S": "${TODAY}" } }' --expression-attribute-names '{"#a": "Timestamp", "#b": "Timestamp"}' --region ap-northeast-1
{
    "Items": [],
    "Count": 0,
    "ScannedCount": 64410,
    "ConsumedCapacity": null
}
 
  • 以下、OKのサンプル例です。“‘$var'”のように、ダブルクォーテーションとシングルクォートを重ねて囲むことで変数が展開されます。これで意図したとおりに検索が可能です。

aws dynamodb scan --table-name ${TABLENAME} --filter-expression '#a >= :1 and #b < :2' --expression-attribute-values '{ ":1": { "S": "${YESTD}" }, ":2": { "S": "${TODAY}" } }' --expression-attribute-names '{"#a": "Timestamp", "#b": "Timestamp"}' --region ap-northeast-1

AWS, bash, DynamoDB

Posted by takaaki