私は日付、時刻、電話番号を含むファイルを読み取り、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)
これを実行するとすぐに文字が来ます。ところで、特定の時間に外出するように通知をスケジュールしたいと思います。だからスクリプトをこのように変更しました。
#!/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
これはいいですね。
しかし、テキストメッセージを受け取ったことはありません。
私の考えではshに問題があるようですが、atは実際にコマンドが正常に完了したかどうかを示すログファイルを生成しないため、わかりません。
答え1
パラメータ拡張を使用すると、Bashに変数を参照するように指示できますapi
。
${parameter@operator}
拡張は、演算子の値に応じたパラメーター値の変換、またはパラメーター自体に関する情報です。各演算子は文字です。
Q
拡張は、入力として繰り返し使用できる形式でパラメータ値を参照する文字列です。
だから:
echo curl -k "${api@Q}" | at "$time"
同様に、引用符をエスケープすると、echo curl -k \"$api\"
拡張時にapi
フィールド分割とワイルドカード拡張が実行されるため、内容によっては問題が発生する可能性があります。したがって、通常引用し"${api}"
、bashに再引用して使用するように指示することをお勧めします"${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