我正在编写一个脚本,它将连续向端口 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
ing。将变量替换为${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'
与在 shell 中输入完全相同echo 'Running Script'
。自己尝试一下:它将输出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
来执行它。作为slhck 建议,您可以通过用花括号括起来来使用该变量:
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 会在执行命令之前替换变量,因此输入变量名将导致其内容被执行。