バックティックを変数として使用すると、一致する""が見つかると予期しないEOFが発生します。

バックティックを変数として使用すると、一致する""が見つかると予期しないEOFが発生します。

以下のコードが実行されています。

[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

関連情報