Estoy escribiendo un script que transmitirá continuamente algunos datos al puerto 30000, de modo que un oyente udp de Python pueda obtener los datos e insertarlos en una tabla, de la cual puedo extraer esa información y mostrarla en una página web.
Entonces quiero ejecutar
echo -n -e "\x00\x00\x0A\x00 1 012601234512345\x00" | nc -w1 -u localhost 3000
en el script bash en un bucle while.
Este es el script bash que tengo hasta ahora:
#!/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
La variable x aumenta cada vez a lo largo del ciclo, por lo que los datos cambian cada vez.
En este momento estoy pensando que en lugar de enviarlo como un comando al terminal, simplemente sale como una cadena. Soy muy nuevo en esto y cualquier ayuda sería muy apreciada.
Respuesta1
Lo estás pensando demasiado.
Simplemente coloque allí el comando que desea ejecutar, sin citarlo ni echo
escribirlo. Reemplace la variable con ${x}
. Las variables se sustituirán en cadenas entre comillas dobles y está {}
ahí para garantizar que su variable se interprete como x
y no como 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
Respuesta2
De hecho, estás repitiendo el comando en lugar de ejecutarlo.
Los scripts Bash se ejecutan línea por línea como comandos. Entonces esta línea:
echo 'Running Script'
es un equivalente exacto de escribir echo 'Running Script'
en Shell. Pruébelo usted mismo: generará Running Script
. Conclusión: echo
enviará todos sus argumentos a la terminal.
Dicho esto, esta línea:
echo 'echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000'
se enviará echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000
a la terminal. Se ejecuta toda la línea, se genera el argumento.
Todavía parece confuso, así que simplifiquémoslo un poco: dejemos que nuestro comando sea echo 'echo -n -e "blah"'
.
Le ha dicho que envíe el comando, por lo que ha emitido el comando. Suelta el exterior echo
para ejecutarlo en su lugar. Comoslhck sugirió, puedes hacer uso de la variable envolviéndola entre llaves:
echo -n -e "\x00\x00\x0A\x00 1 012601234${x}12345\x00" | nc -w1 -u localhost 30000
Ejecutará el comando, pero no lo generará. Si desea generar el comando, intente esto:
cmd="echo -n -e \"\x00\x00\x0A\x00 1 012601234${x}12345\x00\" | nc -w1 -u localhost 30000"
echo $cmd
$cmd
La primera línea asigna su comando a una cmd
variable, la segunda línea lo genera y la tercera lo ejecuta. Parece confuso al principio, pero es bastante simple: bash simplemente reemplazará las variables antes de ejecutar un comando, por lo que escribir el nombre de la variable hará que se ejecute su contenido.