如何在shell腳本中傳變量的值傳給curl


如何在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

結果

image-20210723144722549
image-20210723144722549

通過測試的結果來看,這是典型的沒有正確傳變量值。通過查找相關資料確認,是因為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

結果:

image-20210723163740961
image-20210723163740961

從最后的結果能看出來,已經成功的將值傳過來了,完事!

參考鏈接

BrambleXu


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM