如何在 bash 脚本中执行命令?

Ed *_*nce 11 linux bash

我正在编写一个脚本,它会不断地向端口 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
Run Code Online (Sandbox Code Playgroud)

x 变量在整个循环中每次都在递增,因此数据每次都会发生变化。

目前我认为与其将其作为命令输出到终端,不如将其作为字符串输出。我对 bash 很陌生,任何帮助将不胜感激。

slh*_*hck 10

你多虑了。

只需将您要执行的命令放在那里,无需引用或执行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
Run Code Online (Sandbox Code Playgroud)


gro*_*taj 9

您确实是在回显命令而不是执行它。

Bash 脚本作为命令逐行执行。所以这一行:

echo 'Running Script'
Run Code Online (Sandbox Code Playgroud)

完全等同echo 'Running Script'于在 shell中键入。自己尝试一下:它会输出Running Script. 结论:echo将其所有参数输出到终端。

使用上述命令执行 bash 的屏幕截图

话虽如此,这一行:

echo 'echo -n -e "\x00\x00\x0A\x00        1      012601234'$x'12345\x00" | nc -w1 -u localhost 30000'
Run Code Online (Sandbox Code Playgroud)

将输出echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000到终端整行被执行,它输出的参数。

在 bash 中执行的第二个命令

它看起来仍然令人困惑,所以让我们稍微简化一下:让我们的命令是echo 'echo -n -e "blah"'.

blah 命令在 bash 中运行

你已经告诉它输出命令,所以它输出了命令。删除外部echo以执行它。正如slhck 建议的那样,您可以通过用花括号将其包裹来使用该变量:

echo -n -e "\x00\x00\x0A\x00        1      012601234${x}12345\x00" | nc -w1 -u localhost 30000
Run Code Online (Sandbox Code Playgroud)

它将执行命令,但不输出它。如果你想输出命令,试试这个:

cmd="echo -n -e \"\x00\x00\x0A\x00        1      012601234${x}12345\x00\" | nc -w1 -u localhost 30000"
echo $cmd
$cmd
Run Code Online (Sandbox Code Playgroud)

第一行将您的命令分配给一个cmd变量,第二行输出它,第三行执行它。一开始看起来很混乱,但其实很简单:bash 只会在执行命令之前替换变量,所以输入变量名会导致其内容被执行。