예약된 명령이 실행되지 않음 - 문제 해결

예약된 명령이 실행되지 않음 - 문제 해결

저는 날짜, 시간, 전화번호가 포함된 파일을 읽고 SMS 공급자 API를 사용하여 SMS 알림을 보내는 bash 스크립트를 작성 중입니다.

#!/bin/bash

while read date time phone
do

user=user
pass=pass
senderid=senderid
message=Your%20appointment%20is%20at%20$date%20$time.%20For%20cancellations%20call%2096989898.%20Thank%20you.
api="https://sms.service.com/Websms/sendsms.aspx?User=$user&passwd=$pass&mobilenumber=357$phone&message=$message&senderid=$senderid&type=0"

curl -k $api

done < ~/sms_reminders/events/events_$(date +%d-%m-%y)

이렇게 실행하면 바로 문자가 옵니다. 그런데 특정 시간에 외출하도록 알림을 예약하고 싶습니다. 그래서 스크립트를 이렇게 바꿨습니다.

#!/bin/bash

while read date time phone
do

user=user
pass=pass
senderid=senderid
message=Your%20appointment%20is%20at%20$date%20$time.%20For%20cancellations%20call%2096989898.%20Thank%20you.
api="https://sms.service.com/Websms/sendsms.aspx?User=$user&passwd=$pass&mobilenumber=357$phone&message=$message&senderid=$senderid&type=0"

echo curl -k $api | at $time

done < ~/sms_reminders/events/events_$(date +%d-%m-%y)

라는 메시지를 받았어요

warning: commands will be executed using /bin/sh
job 22 at Fri Jun  6 21:46:00 2019

이것은 좋다.

하지만 문자 메시지를 받은 적은 없습니다.

내 생각엔 sh에 문제가 있는 것 같지만 at은 명령이 성공적으로 완료되었는지 여부를 나타내는 로그 파일을 실제로 생성하지 않기 때문에 확신할 수 없습니다.

답변1

매개변수 확장을 통해 Bash에게 변수를 참조하도록 지시할 수 있습니다 api.

${parameter@operator}
확장은 연산자 값에 따라 매개변수 값의 변환이거나 매개변수 자체에 대한 정보입니다. 각 연산자는 문자입니다.

  • Q 확장은 입력으로 반복적으로 사용할 수 있는 형식으로 매개변수 값을 참조하는 문자열입니다.

그래서:

echo curl -k "${api@Q}" | at "$time"

처럼 따옴표를 이스케이프하면 echo curl -k \"$api\"확장 시 api필드 분할 및 와일드카드 확장이 수행되므로 내용에 따라 문제가 발생할 수 있습니다. 따라서 정상적으로 인용 "${api}"하고 bash에게 다시 인용하여 사용하도록 지시하는 것이 좋습니다 "${api@Q}".

참고로 예제 입력을 사용하면 출력은 다음과 같습니다.

$ echo curl -k "${api@Q}"
curl -k 'https://sms.service.com/Websms/sendsms.aspx?User=user&passwd=pass&mobilenumber=357&message=Your%20appointment%20is%20at%20%20.%20For%20cancellations%20call%2096989898.%20Thank%20you.&senderid=senderid&type=0'

출력의 URL 주위에 추가된 작은따옴표에 유의하세요.

답변2

난 이걸 해야 해

echo curl -k \"$api\" | at $time

관련 정보