при невыполнении запланированной команды - устранение неполадок

при невыполнении запланированной команды - устранение неполадок

Я пишу этот 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

Связанный контент