Estou escrevendo este script bash, que lerá um arquivo contendo uma data, uma hora e um número de telefone, e usará uma API de provedor de SMS para enviar um lembrete por 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)
Quando executo assim, recebo um SMS imediatamente. Mas quero agendar o lembrete para sair em um horário específico. Então eu mudo o script para isso.
#!/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)
E recebo uma mensagem dizendo
warning: commands will be executed using /bin/sh
job 22 at Fri Jun 6 21:46:00 2019
Qual é bom.
Mas nunca recebo o SMS.
Meu palpite é que o problema tem algo a ver com sh, mas não tenho como ter certeza porque at não gera realmente um arquivo de log informando se o comando foi concluído com sucesso ou não.
Responder1
Você pode expandir os parâmetros para dizer ao Bash para citar a api
variável:
${parameter@operator}
A expansão é uma transformação do valor do parâmetro ou uma informação sobre o próprio parâmetro, dependendo do valor do operador. Cada operador é uma única letra:
Q
A expansão é uma string que é o valor do parâmetro citado em um formato que pode ser reutilizado como entrada.
Então:
echo curl -k "${api@Q}" | at "$time"
Se você escapar das aspas como em echo curl -k \"$api\"
, a expansão de api
sofrerá divisão de campo e expansão de curinga, o que pode causar problemas dependendo do conteúdo. Portanto, é melhor citá-lo normalmente "${api}"
e dizer ao bash para citá-lo novamente para entrada usando "${api@Q}"
.
Para referência, com a entrada de exemplo, a saída é:
$ 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'
Observe as aspas simples adicionadas ao URL na saída.
Responder2
Eu tive que fazer assim
echo curl -k \"$api\" | at $time