スケジュールされたコマンドが実行されない - トラブルシューティング

スケジュールされたコマンドが実行されない - トラブルシューティング

私は、日付、時刻、電話番号を含むファイルを読み取り、SMS プロバイダー API を使用して SMS リマインダーを送信する bash スクリプトを作成しています。

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

どっちがいい。

しかし、SMS は受信されません。

私の推測では、この問題は sh に関係していると思われますが、コマンドが正常に完了したかどうかを示すログ ファイルを at が実際に生成しないため、確信を得る方法がありません。

答え1

パラメータ展開を使用して、Bash に変数を引用符で囲むように指示できますapi

${parameter@operator}
展開は、演算子の値に応じて、パラメータの値の変換、またはパラメータ自体の情報になります。各演算子は 1 文字です。

  • Q 拡張は、入力として再利用できる形式で引用されたパラメータの値である文字列です。

それで:

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

のように引用符をエスケープするとecho curl -k \"$api\"、 の展開でフィールド分割とワイルドカード展開が行われ、内容によっては問題が発生する可能性があります。そのため、 を通常の引用符で囲み、 を使って入力時に再度引用符で囲むように bash に指示する方がapi適切です。"${api}""${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

関連情報