我正在用AWS编写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来解决这个问题,但是我真的很想知道到底是什么导致鲤鱼吃贝壳。
有什么想法吗?
发布于 2020-03-19 12:57:10
不是回答,而是格式化的评论:
实际上,您不应该使用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
复制相似问题