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[@]}")

관련 정보