Frage zum Verhalten einer if-Anweisung in Bash

Frage zum Verhalten einer if-Anweisung in Bash

Ich habe das folgende Bash-Skript geschrieben.

if [ $(tmux has -t junk) ]
then
echo zero
else
echo one
fi

Es gibt immer eine Eins zurück, egal ob die Sitzung existiert oder nicht. Ich habe es in der Befehlszeile überprüft, indem ich die tmux-Anweisung ausgeführt und dann $? ausgeführt habe. Es verhält sich wie erwartet, null, wenn die Sitzung existiert, und eins, wenn die Sitzung nicht existiert. Warum verhält sich die if-Anweisung nicht gleich? Ich habe versucht, die if-Anweisung wie unten zu ändern

tmux has -t junk
if [ $? -eq 0 ]
then
echo zero
else
echo one
fi

Das obige Ding funktioniert. Was ist also falsch am ersten Anweisungsblock?

Antwort1

Wie erwähnt, if [ $(tmux has -t junk) ]erweitern Sie auf , if [ ]was als „false“ ausgewertet wird.

Du könntest benutzen:

if tmux has -t junk; then
    echo OK
else
    echo ERR
fi

Oder wenn Sie es kürzer wollen:

tmux has -t junk || echo ERR

Oder

tmux has -t junk && echo OK || echo ERR

Sie können es auch negieren, wenn das passender ist, wie in:

! tmux has -t junk || echo OK
! tmux has -t junk && echo ERR || echo OK
etc.

Bearbeiten:

Beachten Sie auch, dass Sie, wenn ein Befehl eine Ausgabe erzeugt, diese Ausgabe möglicherweise in das schwarze Loch umleiten möchten, /dev/nullwie in:

 if my_cmd >/dev/null; then echo OK else; echo ERR; fi

Wenn der Befehl einen Textfehler erzeugt, können Sie auch die Standardfehlerausgabe umleiten, indem Sie:

 if my_cmd >/dev/null 2>&1; then echo OK else; echo ERR; fi

Das Folgende ist Ihnen vielleicht schon bekannt, aber wir möchten es der Vollständigkeit halber hinzufügen.

Wie erwähnt: $?ist dies die einzige Möglichkeit, den Rückgabewert des Programms zu erhalten.

Einige Programme haben unterschiedliche Renditen und können eine ziemlich eindeutige Bedeutung haben.

Also zB:

mycmd
ecode=$?

case "$ecode" in
0) echo "Success";;
1) echo "Operation not permitted";;
2) echo "No such file or directory";;
esac

Hierdurch können bei spezifischen Fehlern entsprechende Maßnahmen ergriffen werden.

Wenn Sie MySQL installiert haben, können Sie dies beispielsweise tun durchperror:

for i in {0..50}; do perror $i; done
# And
for i in {1000..1050}; do perror $i; done

um ein Gefühl dafür zu bekommen.

Siehe auchdiese Antwortim Zusammenhang mit betriebssystemspezifischen Fehlern, die auch auf das Open Groups-Dokument verweisenFehlernummernUnderrno.h.

Oder schauen Sie sich anSQLiteund seinerweiterte.

Antwort2

Bei Verwendung von:

if [ $(tmux has -t junk) ]

Dadurch wird die Ausgabe des Befehls überprüft, tmux has -t junknicht jedoch der Rückgabewert.

Da also wie im ersten Fall immer eins gedruckt wird, bedeutet dies, dass der tmux has -t junkBefehl nichts auf der Standardausgabe druckt.

Im ersten Fall

if [ $(tmux has -t junk) ] 

wird bewertet als

if [ ]

verwandte Informationen