如何在shell腳本中傳變量的值傳給curl
隨着即時通訊的發展,大量的報警媒介已經從以往的郵件轉為釘釘,企業微信等聊天工具。當我使用shell腳本來監控
Keepalived的時候,在給curl傳遞變量的時候無法生效,經過查找相關資料有所了解並加以解決,解決方案如下:
解決方案
錯誤shell代碼:
#!/bin/bash
#
notify() {
#mailsubject="$(hostname) to be $1, vipIP 切換成功 "
local mailsubject="$(date +'%F %T'):$(hostname) to be $1, vipIP 切換成功 "
local mailbody="$(hostname) 修改成 $1 模式"
#local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
#echo "$mailbody" | mail -s "$mailsubject" $contact
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text",
"text": {
"content": "測試$mailsubject"
}
}'
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
結果:
通過測試的結果來看,這是典型的沒有正確傳變量值。通過查找相關資料確認,是因為shell腳本的單引號字符串有所限制,單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的。然后在我們這個腳本中,發送釘釘消息,需要傳遞變量值內容的剛好是在單引號中,也就導致了無法正常傳遞。那么怎么解決這個問題呢?既然找到問題了,那么解決也簡單,我們需要將符號轉義即可。方法如下👇:
-
在單引號周圍添加雙引號
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \ -H 'Content-Type: application/json' \ -d '{"msgtype": "text", "text": { "content": "'"測試$mailsubject"'" } }' }
那么正確的代碼如下:
#!/bin/bash
#
notify() {
#mailsubject="$(hostname) to be $1, vipIP 切換成功 "
local mailsubject="$(date +'%F %T'):$(hostname) to be $1, vipIP 切換成功 "
local mailbody="$(hostname) 修改成 $1 模式"
#local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
#echo "$mailbody" | mail -s "$mailsubject" $contact
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text",
"text": {
"content": "'"測試 ${mailsubject}\n ${mailbody}"'"
}
}'
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
結果:
從最后的結果能看出來,已經成功的將值傳過來了,完事!
