我正在编写这个 bash 脚本,它将读取包含日期、时间和电话号码的文件,并且它将使用短信提供商 API 发送短信提醒。
#!/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"
如果像 in 那样转义引号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