以下のコードが実行されています。
[ec2-user@ip restore]$ echo $snap_name
manual-test-2024-01-11-11-26-19
[ec2-user@ip restore]$ aws rds describe-db-cluster-snapshots --db-cluster-identifier creditpoc3 --query 'DBClusterSnapshots[].{DBClusterSnapshotIdentifier:DBClusterSnapshotIdentifier,Status:Status} | [?DBClusterSnapshotIdentifier == `'"$snap_name"'`']'' | grep creating
[ec2-user@ip-10-0-39-226 restore]$
ただし、出力を変数として取得しようとするとエラーが発生します。
[ec2-user@ip restore]$ snap_count=`aws rds describe-db-cluster-snapshots --db-cluster-identifier creditpoc3 --query 'DBClusterSnapshots[].{DBClusterSnapshotIdentifier:DBClusterSnapshotIdentifier,Status:Status} | [?DBClusterSnapshotIdentifier == `'"$snap_name"'`']'' | grep creating`
-bash: command substitution: line 1: unexpected EOF while looking for matching `''
-bash: command substitution: line 2: syntax error: unexpected end of file
-bash: command substitution: line 1: unexpected EOF while looking for matching `''
-bash: command substitution: line 2: syntax error: unexpected end of file
[ec2-user@ip restore]$
ここに提案してください。
答え1
問題は、コマンドの置き換えに以前の「バックティック」表記法を使用していることです。彼らの目的は落胆、何よりも簡単に入れ子にすることができないからです。
コマンド置換がクエリ条件のオープンバックティック(つまり、その部分のみ)にのみコマンドを拡張すると考えると、表示されるエラーメッセージを理解できます。
aws rds describe-db-cluster-snapshots --db-cluster-identifier creditpoc3 --query 'DBClusterSnapshots[].{DBClusterSnapshotIdentifier:DBClusterSnapshotIdentifier,Status:Status} | [?DBClusterSnapshotIdentifier ==
その後、シェルはsnap_count
次の変数を連結しようとします。
- そのコマンド呼び出しの結果 - 不均衡な左引用符があるため、シェルはこれを解析できません(これは2つのエラーメッセージの最初の原因です)。
- 解釈の結果は
'"$snap_name"'
リテラル文字列です。"$snap_name"
シェルの観点から一重引用符で囲んだ後 - その他コマンド置換は、所望のクエリ基準のクローズバックティックで始まる。これはコマンドの出力になり
']'' | grep creating
、これは再び不均衡な一重引用符を持ち、2つのエラーメッセージの2番目の原因です。
@ilkkachuが指摘したように、結果として割り当ての$snap_count
唯一の有効な部分、つまりリテラル文字列が割り当てられます"$snap_name"
。
推奨$( ... )
- 記号を使用してください。実際コマンドの置き換え(つまり、外の` ... `
バックティック)、これは必要な条件のクエリ構文と競合しません?DBClusterSnapshotIdentifier
。