シェルスクリプトでJSONと変数を使う方法
Contents
前提条件
- 今回は、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