Bash에서 공백이 있는 문자열 배열 사용 - "curl: 호스트를 확인할 수 없습니다"라는 오류 메시지

Bash에서 공백이 있는 문자열 배열 사용 - "curl: 호스트를 확인할 수 없습니다"라는 오류 메시지

서버의 특정 측면을 모니터링하고 문제가 있는 경우 Slack에 메시지를 보내기 위해 bash에 스크립트를 작성하려고 합니다. 그러나 나는 내 스크립트의 구문에 문제가 있다고 믿게 만드는 일련의 이상한 오류 메시지를 접했습니다. 문제의 코드는 다음과 같습니다.

message=("Please go to this website: www.google.com" "Please go to this website: www.github.com" "Please go to this website: www.wikipedia.com")

for j in seq `0 2`; do
curl -X POST -H 'Content-type: application/json' --data '{"text":"<!channel>  '${message[$j]}' "}' https://hooks.slack.com/services/AN_ID/ANOTHER_ID/SOME_ID# Slack with channel mention
done

이 코드를 실행하면 "@channel 이 웹사이트를 방문하세요: www.google.com"과 같은 지정된 각 텍스트 줄에 대해 지정된 Slack 그룹에 메시지를 보내야 합니다.

이 프로그램을 실행하면 다음과 같은 오류 메시지가 나타납니다.

curl: (6) Could not resolve host: go
curl: (6) Could not resolve host: to
curl: (6) Could not resolve host: this
curl: (6) Could not resolve host: website:
curl: (3) [globbing] unmatched close brace/bracket in column 34
invalid_payloadcurl: (6) Could not resolve host: go
curl: (6) Could not resolve host: to
curl: (6) Could not resolve host: this
curl: (6) Could not resolve host: website:
curl: (3) [globbing] unmatched close brace/bracket in column 33

이러한 오류 메시지를 해결하는 방법에 대한 통찰력을 가진 사람이 있습니까? 이것이 문자열 배열을 작성한 방식과 관련이 있는 것 같은데 문제가 무엇인지 알 수 없습니다.

답변1

문제는 배열 선언이 아니라 요소에 액세스하는 방식에 있습니다. 바라보다이 게시물

따라서 SO의 원래 답변을 인용하면 다음과 같습니다.

for ((i = 0; i < ${#message[@]}; i++))
do
    echo "${message[$i]}"
done

내 입장에선 잘 작동해

(Panki의 제안이 정확합니다. seq 매개변수 주위의 백틱을 제거하십시오. 대신 사용할 수 있습니다 $(seq 0 2). 그러나 이것은 문제를 해결하지 못합니다.)

답변2

가독성을 위해 다음과 같이 합니다.

messages=(
    "first"
    "second"
    ...
)
curl_opts=(
    -X POST
    -H 'Content-type: application/json'
)
data_tmpl='{"text":"<!channel>  %s "}' 
url=https://hooks.slack.com/services/...

for msg in "${messages[@]}"; do
    curl "${curl_opts[@]}" --data "$(printf "$data_tmpl" "$msg")" "$url" 
done

관련 정보