Bash

在未執行預定命令時 - 故障排除

  • June 7, 2019

我正在編寫這個 bash 腳本,它將讀取一個包含日期、時間和電話號碼的文件,並將使用 SMS 提供程序 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 並沒有真正生成一個日誌文件來說明命令是否成功完成。

您可以參數擴展來告訴 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 周圍添加的單引號。

引用自:https://unix.stackexchange.com/questions/523400