Estoy escribiendo este script bash, que leerá un archivo que contiene una fecha, una hora y un número de teléfono, y utilizará una API de proveedor de SMS para enviar un recordatorio 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)
Cuando lo ejecuto así, recibo un SMS inmediatamente. Pero quiero programar el recordatorio para que salga a una hora específica. Entonces cambio el guión a esto.
#!/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)
Y recibo un mensaje que dice
warning: commands will be executed using /bin/sh
job 22 at Fri Jun 6 21:46:00 2019
Lo que es bueno.
Pero nunca recibo el SMS.
Supongo que el problema tiene algo que ver con sh, pero no tengo forma de estar seguro porque en realidad no genera un archivo de registro que indique si el comando se completó correctamente o no.
Respuesta1
Puede expandir los parámetros para indicarle a Bash que cite la api
variable:
${parameter@operator}
La expansión es una transformación del valor del parámetro o información sobre el parámetro en sí, según el valor del operador. Cada operador es una sola letra:
Q
La expansión es una cadena que es el valor del parámetro citado en un formato que puede reutilizarse como entrada.
Entonces:
echo curl -k "${api@Q}" | at "$time"
Si escapa de las comillas como en echo curl -k \"$api\"
, la expansión de api
sufrirá una división de campos y una expansión de comodines, lo que podría causar problemas según el contenido. Por lo tanto, es mejor citarlo normalmente "${api}"
y decirle a bash que lo cite nuevamente para ingresarlo usando "${api@Q}"
.
Como referencia, con la entrada del ejemplo, la salida es:
$ 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'
Tenga en cuenta las comillas simples agregadas alrededor de la URL en el resultado.
Respuesta2
tuve que hacerlo asi
echo curl -k \"$api\" | at $time