al no ejecutar el comando programado - solución de problemas

al no ejecutar el comando programado - solución de problemas

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 apivariable:

${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 apisufrirá 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

información relacionada