Я пишу этот bash-скрипт, который будет считывать файл, содержащий дату, время и номер телефона, и использовать API провайдера SMS для отправки SMS-напоминания.
#!/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)
Когда я запускаю его таким образом, я получаю SMS немедленно. Но я хочу запланировать напоминание на определенное время. Поэтому я меняю сценарий на этот.
#!/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