서버의 특정 측면을 모니터링하고 문제가 있는 경우 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