Ich schreibe ein Skript, das kontinuierlich einige Daten an Port 30000 sendet, sodass ein Python-UDP-Listener die Daten abrufen und in eine Tabelle einfügen kann, aus der ich diese Informationen entnehmen und auf einer Webseite anzeigen kann.
Ich möchte also ausführen
echo -n -e "\x00\x00\x0A\x00 1 012601234512345\x00" | nc -w1 -u localhost 3000
im Bash-Skript in einer While-Schleife.
Dies ist das Bash-Skript, das ich bisher habe:
#!/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
Die x-Variable wird während der gesamten Schleife jedes Mal erhöht, sodass sich die Daten jedes Mal ändern.
Im Moment denke ich, dass es nicht als Befehl an das Terminal ausgegeben wird, sondern nur als Zeichenfolge. Ich bin ein Neuling bei Bash und wäre für jede Hilfe sehr dankbar.
Antwort1
Du denkst zu viel darüber nach.
Geben Sie dort einfach den Befehl ein, den Sie ausführen möchten, ohne ihn in Anführungszeichen zu setzen oder echo
zu ingen. Ersetzen Sie die Variable durch ${x}
. Variablen werden in Zeichenfolgen in doppelten Anführungszeichen ersetzt, und das ist vorhanden, um sicherzustellen, dass Ihre Variable als und nicht als {}
interpretiert wird .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
Antwort2
Sie geben den Befehl tatsächlich wieder, anstatt ihn auszuführen.
Bash-Skripte werden zeilenweise als Befehle ausgeführt. Diese Zeile lautet also:
echo 'Running Script'
ist das genaue Äquivalent zur Eingabe echo 'Running Script'
in der Shell. Probieren Sie es selbst aus: Es wird ausgegeben Running Script
. Fazit: echo
gibt alle seine Argumente an das Terminal aus.
Davon abgesehen diese Zeile:
echo 'echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000'
wird an das Terminal ausgegeben. echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000
Die gesamte Zeile wird ausgeführt und das Argument ausgegeben.
Es sieht immer noch verwirrend aus, also vereinfachen wir es ein wenig: Lassen Sie unseren Befehl lauten echo 'echo -n -e "blah"'
.
Sie haben ihm gesagt, dass er den Befehl ausgeben soll, also hat er den Befehl ausgegeben. Lassen Sie das Äußere weg, echo
um ihn stattdessen auszuführen. Alsslhck hat vorgeschlagenkönnen Sie die Variable nutzen, indem Sie sie in geschweifte Klammern setzen:
echo -n -e "\x00\x00\x0A\x00 1 012601234${x}12345\x00" | nc -w1 -u localhost 30000
Der Befehl wird ausgeführt, aber nicht ausgegeben. Wenn Sie den Befehl ausgeben möchten, versuchen Sie Folgendes:
cmd="echo -n -e \"\x00\x00\x0A\x00 1 012601234${x}12345\x00\" | nc -w1 -u localhost 30000"
echo $cmd
$cmd
Die erste Zeile weist Ihren Befehl einer cmd
Variablen zu, die zweite Zeile gibt ihn aus und die dritte führt ihn aus. Das sieht zunächst verwirrend aus, ist aber ziemlich einfach: Bash ersetzt Variablen einfach, bevor ein Befehl ausgeführt wird. Wenn Sie also den Variablennamen eingeben, wird sein Inhalt ausgeführt.