Bash

如何在bash中執行具有許多嵌套單引號和雙引號且帶引號的變數的命令

  • July 11, 2019

這是我的簡單腳本

#!/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"

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