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 문서 링크참고로, 모든 것을 다시 확인해 보니 규정을 준수하는 것처럼 보였습니다. :디
이것이 문제를 일으키고 있는 것 같습니다 *
. 이렇게 하면 문제를 해결할 수 있다는 것을 알지만 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[@]}")