ShellCheckは実際には二重引用符で囲まれた表現ではないと文句を言います。なぜですか?

ShellCheckは実際には二重引用符で囲まれた表現ではないと文句を言います。なぜですか?

AWS CLIを使用してbashスクリプトを作成していますが、shellcheck誤ったエラーが発生します。なぜそれが難しいのかを理解しようとしています。

コードとエラーメッセージは次のとおりです。

for server in $(${aws} ec2 describe-instances --query 'Reservations[].Instances[][].{Name: Tags[?Key==`Name`].Value[] | [0]}' --filters "Name=tag:Name,Values=${server_name}*" --output text);
                                                                                                                                                                            ^-- SC2016: Expressions don't expand in single quotes, use double quotes for that.

SOエディタでコードを正しく整列させることはできませんが、コードを^--指します。*この部分:

"Name=tag:Name,Values=${server_name}*"

エラーは以下を提供します。ShellCheckドキュメントリンクちなみに、すべてを再確認してみると、規制に従うように見えました。 :D

これが問題を引き起こしているようです*。これは問題を解決できることを知っていますが、shellcheck -e SC2016シェルチェック鯉の原因が何であるかを知りたいです。

どんなアイデアがありますか?

答え1

これは間違った肯定ですが、あなたが考えるものとは異なります。それはそれとは何の関係もなく、*それは私に指摘されていません。`Name`一重引用符内の内容については怒っています。例えば、echo '`Name`'バックティックが評価されたいと考えて評価されないことを警告するので、同じ警告が生成される。

答え2

答えではありませんが、フォーマットされた説明です。

for賢明には、ループではなくwhile readループを使用する必要があります。

while IFS= read -r server; do
    : do stuff here
done < <(
    "$aws" ec2 describe-instances \
        --query 'Reservations[].Instances[][].{Name: Tags[?Key==`Name`].Value[] | [0]}' \
        --filters "Name=tag:Name,Values=${server_name}*" \
        --output text
)

for分離された空間を読み取るループ性格whileループを読むワイヤー- バラよりhttp://mywiki.wooledge.org/BashFAQ/001

または、readarrayキャプチャ出力を使用します。

readaray -t servers < <(
    "$aws" ec2 describe-instances \
        --query 'Reservations[].Instances[][].{Name: Tags[?Key==`Name`].Value[] | [0]}' \
        --filters "Name=tag:Name,Values=${server_name}*" \
        --output text
)

for server in "${servers}"; do ...; done

最後に、長く読み取れないコマンドの場合、オプションを配列に保存すると読みやすくなります。

opts=(
    --query 'Reservations[].Instances[][].{Name: Tags[?Key==`Name`].Value[] | [0]}' 
    --filters "Name=tag:Name,Values=${server_name}*"
    --output text
)

readarray -t servers < <("$aws" ec2 describe-instances "${opts[@]}")

関連情報