![ShellCheck는 내 표현이 실제로는 큰따옴표로 묶이지 않은 것을 문제 삼습니다. 왜?](https://rvso.com/image/169441/ShellCheck%EB%8A%94%20%EB%82%B4%20%ED%91%9C%ED%98%84%EC%9D%B4%20%EC%8B%A4%EC%A0%9C%EB%A1%9C%EB%8A%94%20%ED%81%B0%EB%94%B0%EC%98%B4%ED%91%9C%EB%A1%9C%20%EB%AC%B6%EC%9D%B4%EC%A7%80%20%EC%95%8A%EC%9D%80%20%EA%B2%83%EC%9D%84%20%EB%AC%B8%EC%A0%9C%20%EC%82%BC%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%EC%99%9C%3F.png)
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[@]}")