不执行预定命令 - 故障排除

不执行预定命令 - 故障排除

我正在编写这个 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

相关内容