¿Cómo ejecutar un comando dentro de un script bash?

¿Cómo ejecutar un comando dentro de un script bash?

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 echoescribirlo. 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 xy 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: echoenviará todos sus argumentos a la terminal.

Captura de pantalla de bash con el comando anterior ejecutado

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 30000a la terminal. Se ejecuta toda la línea, se genera el argumento.

Segundo comando ejecutado en bash

Todavía parece confuso, así que simplifiquémoslo un poco: dejemos que nuestro comando sea echo 'echo -n -e "blah"'.

El comando bla se ejecutó en bash.

Le ha dicho que envíe el comando, por lo que ha emitido el comando. Suelta el exterior echopara 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 cmdvariable, 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.

información relacionada