Wie führe ich einen Befehl innerhalb eines Bash-Skripts aus?

Wie führe ich einen Befehl innerhalb eines Bash-Skripts aus?

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 echozu 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 .xx12345

#!/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: echogibt alle seine Argumente an das Terminal aus.

Screenshot von Bash mit dem oben ausgeführten Befehl

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 30000Die gesamte Zeile wird ausgeführt und das Argument ausgegeben.

Zweiter in Bash ausgeführter Befehl

Es sieht immer noch verwirrend aus, also vereinfachen wir es ein wenig: Lassen Sie unseren Befehl lauten echo 'echo -n -e "blah"'.

Der Befehl „blah“ wurde in Bash ausgeführt

Sie haben ihm gesagt, dass er den Befehl ausgeben soll, also hat er den Befehl ausgegeben. Lassen Sie das Äußere weg, echoum 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 cmdVariablen 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.

verwandte Informationen