beim Nichtausführen des geplanten Befehls - Fehlerbehebung

beim Nichtausführen des geplanten Befehls - Fehlerbehebung

Ich schreibe dieses Bash-Skript, das eine Datei mit einem Datum, einer Uhrzeit und einer Telefonnummer liest und die API eines SMS-Anbieters verwendet, um eine SMS-Erinnerung zu senden.

#!/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)

Wenn ich es so ausführe, erhalte ich sofort eine SMS. Ich möchte aber, dass die Erinnerung zu einem bestimmten Zeitpunkt verschickt wird. Also ändere ich das Skript folgendermaßen.

#!/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)

Und ich bekomme eine Nachricht,

warning: commands will be executed using /bin/sh
job 22 at Fri Jun  6 21:46:00 2019

Was gut ist.

Aber ich erhalte die SMS nie.

Ich vermute, dass das Problem etwas mit sh zu tun hat, kann es mir aber nicht mit Sicherheit sagen, da at keine Protokolldatei generiert, die angibt, ob der Befehl erfolgreich ausgeführt wurde oder nicht.

Antwort1

Sie können die Parametererweiterung verwenden, um Bash anzuweisen, die apiVariable in Anführungszeichen zu setzen:

${parameter@operator}
Die Erweiterung ist entweder eine Transformation des Parameterwertes oder eine Information über den Parameter selbst, abhängig vom Wert des Operators. Jeder Operator ist ein einzelner Buchstabe:

  • Q Die Erweiterung ist eine Zeichenfolge, die den Wert des Parameters in Anführungszeichen in einem Format darstellt, das als Eingabe wiederverwendet werden kann.

Also:

echo curl -k "${api@Q}" | at "$time"

Wenn Sie die Anführungszeichen wie in maskieren echo curl -k \"$api\", wird die Erweiterung von apieiner Feldaufteilung und einer Platzhaltererweiterung unterzogen, was je nach Inhalt zu Problemen führen kann. Daher ist es besser, es normal in Anführungszeichen zu setzen "${api}"und Bash anzuweisen, es für die Eingabe mit erneut in Anführungszeichen zu setzen "${api@Q}".

Zur Referenz: Mit der Beispieleingabe lautet die Ausgabe:

$ 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'

Beachten Sie die einfachen Anführungszeichen, die in der Ausgabe um die URL hinzugefügt werden.

Antwort2

Ich musste es so machen

echo curl -k \"$api\" | at $time

verwandte Informationen