我正在編寫一個腳本,它將不斷地向連接埠 30000 廣播一些數據,以便 python udp 偵聽器可以獲取數據並將其插入到表中,我可以從中提取該資訊並顯示在網頁上。
所以,我想執行
echo -n -e "\x00\x00\x0A\x00 1 012601234512345\x00" | nc -w1 -u localhost 3000
在 bash 腳本中的 while 迴圈中。
這是我到目前為止的 bash 腳本:
#!/bin/bash
echo 'Running Script'
a=0
x=1
while [ $a -le 1 ]
do
echo 'echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000'
sleep 5
let x=$(($x + 1))
done
x 變數在整個循環中每次都會遞增,因此資料每次都會發生變化。
目前我在想,與其將其作為命令輸出到終端,不如將其作為字串輸出。我對 bash 很陌生,任何幫助將不勝感激。
答案1
你想太多了。
只需將要執行的命令放在那裡,無需引用或echo
引用它。將變數替換為${x}
.變數將被替換為雙引號字串,並且 是{}
為了確保您的變數被解釋為x
而不是x12345
。
#!/bin/bash
echo 'Running Script'
a=0
x=1
while [ $a -le 1 ]
do
echo -n -e "\x00\x00\x0A\x00 1 012601234${x}12345\x00" | nc -w1 -u localhost 30000
sleep 5
let x=$(($x + 1))
done
答案2
您確實是在回顯命令而不是執行它。
Bash 腳本作為命令逐行執行。所以這一行:
echo 'Running Script'
echo 'Running Script'
與在 shell 中輸入完全相同。自己嘗試:它會輸出Running Script
.結論:echo
將其所有參數輸出到終端。
話雖這麼說,這一行:
echo 'echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000'
將輸出echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000
到終端整行被執行,參數被輸出。
它看起來仍然令人困惑,所以讓我們稍微簡化一下:讓我們的命令為echo 'echo -n -e "blah"'
。
你已經告訴它輸出命令,所以它已經輸出了命令。刪除外部echo
來執行它。作為斯爾克建議,您可以用大括號括起來來使用該變數:
echo -n -e "\x00\x00\x0A\x00 1 012601234${x}12345\x00" | nc -w1 -u localhost 30000
它將執行該命令,但不輸出它。如果你想輸出指令,試試看這個:
cmd="echo -n -e \"\x00\x00\x0A\x00 1 012601234${x}12345\x00\" | nc -w1 -u localhost 30000"
echo $cmd
$cmd
第一行將命令分配給一個cmd
變量,第二行輸出它,第三行執行它。一開始看起來很混亂,但其實很簡單:bash 只會在執行命令之前替換變量,因此輸入變數名稱將導致其內容被執行。