Bash

ShellCheck 吹毛求疵地指出我的表達式實際上不在雙引號中;為什麼?

  • March 19, 2020

我正在使用 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但我真的想知道是什麼可能導致 shellcheck 鯉魚。

有任何想法嗎?

這是一個誤報,但它不是你認為的那樣。它與 無關*,也沒有指向我。Name對在單引號內感到不安。例如,echo 'Name'產生相同的警告,因為它認為您希望評估反引號,所以它警告您它們不會。

不是答案,而是格式化的評論:

迂腐地,您不應該使用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[@]}")

引用自:https://unix.stackexchange.com/questions/573654