![ShellCheck 抱怨我的表達式沒有用雙引號引起來,但實際上它是用雙引號引起來的;為什麼?](https://rvso.com/image/169441/ShellCheck%20%E6%8A%B1%E6%80%A8%E6%88%91%E7%9A%84%E8%A1%A8%E9%81%94%E5%BC%8F%E6%B2%92%E6%9C%89%E7%94%A8%E9%9B%99%E5%BC%95%E8%99%9F%E5%BC%95%E8%B5%B7%E4%BE%86%EF%BC%8C%E4%BD%86%E5%AF%A6%E9%9A%9B%E4%B8%8A%E5%AE%83%E6%98%AF%E7%94%A8%E9%9B%99%E5%BC%95%E8%99%9F%E5%BC%95%E8%B5%B7%E4%BE%86%E7%9A%84%EF%BC%9B%E7%82%BA%E4%BB%80%E9%BA%BC%EF%BC%9F.png)
我正在使用 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 鯉魚。
有任何想法嗎?
答案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[@]}")