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[@]}")