Bash
在未執行預定命令時 - 故障排除
我正在編寫這個 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 周圍添加的單引號。