シェルスクリプトエラー - ある変数の出力を別の変数に供給できません

シェルスクリプトエラー - ある変数の出力を別の変数に供給できません

シェルスクリプトを実行すると、次のエラーが発生します。(Bash)

An error occurred (InvalidID) when calling the CreateTags operation: The ID ‘{‘ is not valid”

そのため、シェルスクリプトを見てみると、問題を引き起こす2行のスクリプトがあり、私の場合、行1の出力が行2(--resource $ remote_snapshot_id)の入力として使用されたことがわかりました。

ライン1:

remote_snapshot_id=$(aws ec2 copy-snapshot --region us-east-1 --source-region $region --source-snapshot-id $snapshot_id --description $snapshot_id)

2号線:

aws ec2 create-tags --region us-east-1 --resource $remote_snapshot_id --tags Key=CreatedBy,Value=AutomatedBackup

Linux 端末で 1 行目を 1 つのコマンドで実行しようとすると、次のようになります。

aws --region us-east-1 ec2 copy-snapshot --source-region us-west-1 --source-snapshot-id snap-00220030300040 --description "Automated_Backup_425"

出力:

{
    "SnapshotId": "snap-00880090900090"
}

ただし、2行目には1行目の出力のsnap-00880090900090値のみが必要です。 (現在「{」で始まる出力全体を選択しているため、snap-00880090900090のみを使用しているため、このようなエラーが発生します)

私の質問は、snap-00880090900090をgrepし、2行目(--resource $ remote_snapshot_id)に使用する出力を保存する方法です。

この問題を解決するのに役立つ人はいますか?

答え1

snap-00880090900090 [from]をどうやってgrepしますか{ "SnapshotId": "snap-00880090900090" }

抽出する形式はJSONなので、JSON認識ツールを使用してこれを行うのが最善です。jqインストールできる場合は、以下をお勧めします。

command | jq -r .SnapshotId

command上記のJSONフラグメントを出力すると、コマンドはオプションのために引用符や「生」なしでjq 出力されます。snap-00880090900090-r

適切なJSON認識ツールをインストールできず、より脆弱なソリューションに対応でき、スナップショットIDが常に例に示されている形式(「snap-」の後に一連の数字がオーム)を持つことがわかっている場合は、次のようにGNU grepを使用しますできます。

command | grep -o 'snap-[0-9]\+'

関連情報