ShellCheck는 실제로는 큰따옴표로 묶인 표현이 아니라고 불평합니다. 이유는 무엇입니까?

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 문서 링크참고로, 모든 것을 다시 확인해 보니 규정을 준수하는 것처럼 보였습니다. :디

이것이 문제를 일으키고 있는 것 같습니다 *. 이렇게 하면 문제를 해결할 수 있다는 것을 알지만 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[@]}")

관련 정보