Bash
如何在bash中執行具有許多嵌套單引號和雙引號且帶引號的變數的命令
這是我的簡單腳本
#!/bin/sh thefile=/home/ark/arkserver/ShooterGame/Saved/SaveIsland/1288804998.arktribe while inotifywait "${thefile}" ; do a=\"`strings ${thefile} | tail -n 5 | head -n 1 | sed 's/<[^>]*>//g'`\" echo $a curl -H "Content-Type: application/json" -X POST -d '{\"username\": \"Island\", \"content\": $a}' https://discordapp.com/api/webhooks/5738674701/OjRQiAWHq5mX0Tn2MfBlF-mI41TWrVYVAbOfXpeZWqo8 done
這是輸出
Setting up watches. Watches established. /home/ark/arkserver/ShooterGame/Saved/SaveIsland/1288804998.arktribe ATTRIB "Day 600, 21:31:17: Phorce1 demolished a 'Campfire'!" {"code": 50006, "message": "Cannot send an empty message"}Setting up watches. Watches established.
我無法弄清楚如何使用插入中間的變數正確引用 curl 命令。這就是命令的樣子。這在命令行上輸入時有效
curl -H "Content-Type: application/json" -X POST -d '{"username": "test", "content": "Day 600, 14:51:00: Phorce1 demolished a 'Campfire'!"}' https://discordapp.com/api/webhooks/594723628738674701/OjRQn2MfBlF-FJVl1cWwMlD6UQf0c
我嘗試了許多不同形式的引用。它與正確引用的 $a 相呼應,但仍然破壞了使用它的命令中的某些內容,這一事實使我感到困惑。
(是的,我破壞了我的 webhook 地址)
這個問題被標記為與另一個問題重複,但該問題的答案只是簡單地轉義引號。我的腳本中 curl 命令行的“嵌套引號”性質導致這些答案失敗。在發布我自己的問題之前,我嘗試了多種形式的轉義引號。使用另一個問題的答案中提到的轉義引號,我可以毫無問題地在引號內獲得變數的簡單“迴聲”,但將“在另一組引號內的其他引號內的引號內”插入到curl 命令行會失敗。
單引號防止變數擴展。
我會這樣做:
url=https://discordapp.com/api/webhooks/5738674701/OjRQiAWHq5mX0Tn2MfBlF-mI41TWrVYVAbOfXpeZWqo8 while inotifywait "$thefile" ; do a=$(strings "$thefile" | tail -n 5 | head -n 1 | sed 's/<[^>]*>//g') echo "$a" payload=$(printf '{"username": "Island", "content": "%s"}' "$a") curl -H "Content-Type: application/json" -X POST -d "$payload" "$url" done
您不需要在單引號內轉義雙引號。事實上,如果你這樣做,轉義將被保留為文字字元。
總是引用你的變數,除非你確切地知道如果你不這樣做會發生什麼。
(這是個人風格的問題)您不需要將變數括在引號內,除非您需要從周圍的文本中消除變數名稱的歧義:
echo "$aVariable" echo "${aVariable}_abc"