
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/null
wie 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 junk
nicht jedoch der Rückgabewert.
Da also wie im ersten Fall immer eins gedruckt wird, bedeutet dies, dass der tmux has -t junk
Befehl nichts auf der Standardausgabe druckt.
Im ersten Fall
if [ $(tmux has -t junk) ]
wird bewertet als
if [ ]