So verwenden Sie den Rückgabewert eines Bash-Befehls wie „ifconfig“ als Argument für eine if-Anweisung in einem Bash-Skript

So verwenden Sie den Rückgabewert eines Bash-Befehls wie „ifconfig“ als Argument für eine if-Anweisung in einem Bash-Skript

Ich bin relativ neu im Bash-Scripting, aber ich bin sehr vertraut mit Python und vielen Bash-Befehlen. Ich habe mich gefragt, ob es möglich ist, einen Befehl wie zu verwenden ifconfig eno1und die Ausgabe als Bedingung für eine ifAnweisung zu verwenden. Wenn Sie im Grunde Folgendes eingeben:

 ifconfig eno1

und Sie erhalten eine aktive IP. Gibt es eine Möglichkeit, die Ausgabe davon in einer Variablen als 1/0 oder Wahr/Falsch zu speichern, um sie im folgenden ifAnweisungsbeispiel zu verwenden (vorausgesetzt, dies ifoutputist der Variablenname):

 if [ "$ifoutput" == "$True"]

 then 
         echo connection is active! 
 fi

Ich habe darüber nachgedacht, vielleicht ein Python-Skript aufzurufen, das im Wesentlichen dasselbe tut, aber ich dachte, ich würde auf dasselbe Problem stoßen: Es gibt keine Möglichkeit, einen individuellen Rückgabewert vom Python-Skript zu erhalten, der in der ifAnweisung verwendet werden kann. Bitte geben Sie mir einen Rat und seien Sie nachsichtig mit mir – wie gesagt, ich bin relativ neu im Bash-Skripting! Ich habe bereits Methoden, dies ausschließlich mit Python zu tun, aber ich versuche, mehr über Bash-Skripting zu lernen. Vielen Dank im Voraus!

Antwort1

ifconfiggibt nach Abschluss einen numerischen 8-Bit-Wert zurück (wie jeder *nix-Prozess, der sauber beendet wird).

Normalerweise wird Null ( 0) verwendet, um Erfolg anzuzeigen, und ein anderer Wert, um einen Fehler anzuzeigen. Dieser Rückgabecode ist als verfügbar $?.

ifconfiggibt auch an aus stdout, zum Beispiel:

eth0      Link encap:Ethernet  HWaddr 02:42:ac:14:00:02
          inet addr:172.20.0.2  Bcast:172.20.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:20430143 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20966475 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:46532669457 (46.5 GB)  TX bytes:44114090048 (44.1 GB)

Wenn Sie ermitteln möchten, ob der Vorgang ifconfig eth0erfolgreich war (d. h. ob die Schnittstelle abhängig von den Berechtigungen vorhanden ist), können Sie Folgendes tun:

ifconfig eth0
if [ $? -eq 0 ]; then
  echo yay
fi
if ifconfig eth0; then
  echo yay
fi
ifconfig eth0 && echo yay

Die ifconfigAusgabe von kann durch Anhängen eines Folgendes ausgeblendet werden > /dev/null:

if ifconfig eth0 > /dev/null; then
  echo yay
fi

Sie haben nach dem Drucken des Rückgabecodes gefragt, und das ist ein Problem für Anfänger ...

Sie können ganz einfach Folgendes tun:

ifconfig eth0
echo $?

Aber nach dem Aufruf von ist echoder Rückgabecode ( ) der Rückgabecode von und nicht von ... Um damit umzugehen, weisen Sie ihn einfach einer temporären Variablen zu:$?echoifconfig

ifconfig eth0
RET=$?
echo ${RET}
if [ ${RET} -eq 0 ]; then
  echo yay
fi

Hinweis: [ist ein integrierter Befehl, der Ausdrücke auswerten kann, die eckigen Klammern ( [/ ]) sind eigentlich kein Teil der ifSyntax:

$ help [
[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

Wenn Sie tatsächlich versuchen,Holen Sie sich die IP-Adresse einer Schnittstelle, möchten Sie möglicherweise eine Pipeline wie eine der folgenden verwenden (es gibt viele Möglichkeiten, um dasselbe Ergebnis zu erzielen):

ifconfig eth0 | grep -Eom1 'inet addr:([0-9]{1,3}\.){3}[0-9]{1,3}' | cut -d: -f2
ifconfig eth0 | sed -re '/inet addr:/!d;s/^[^:]+://;s/ .*$//'

verwandte Informationen