Bash
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
但我真的想知道是什麼可能導致 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[@]}")