Ich bin neu in Bash und kann nicht versuchen, den folgenden Befehl zu negieren:
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Sorry you are Offline"
exit 1
Diese if-Bedingung gibt true zurück, wenn ich mit dem Internet verbunden bin. Ich möchte, dass es umgekehrt passiert, aber !
irgendwo zu platzieren scheint nicht zu funktionieren.
linux
bash
if-statement
negate
Sudh33ra
quelle
quelle
if ! [[ ...
funktioniertAntworten:
Du kannst wählen:
!
invertiert die Rückgabe des folgenden Ausdrucks.quelle
test
Befehl:if test $? -ne 0; then
if
erwartet eine Anweisung, die entweder 0 oder 1 ist, so dass Sie den Befehl selbst verwenden und ihn invertieren können:if ! wget ...; then ...; fi
Besser
quelle
!
Lassen Sie zwischen dem und dem folgenden Befehl ein Leerzeichen, da Sie sonst eine Verlaufserweiterung durchführen. unix.stackexchange.com/questions/3747/…Wenn Sie sich faul fühlen, finden Sie hier eine knappe Methode zur Behandlung von Bedingungen mit
||
(oder) und&&
(und) nach der Operation:quelle
&&
den Befehl nach dem Echo in a ändern;
. Der Grund dafür ist, dass, wenn die Ausgabe in eine Datei auf einer vollständigen Festplatte umgeleitet wird, derecho
Fehler zurückgegeben wird und derexit
niemals ausgelöst wird. Dies ist wahrscheinlich nicht das gewünschte Verhalten.set -e
und fehlschlagenecho
wird das Skript trotzdemDa Sie Zahlen vergleichen, können Sie einen arithmetischen Ausdruck verwenden , der eine einfachere Handhabung von Parametern und einen einfacheren Vergleich ermöglicht:
Beachten
-ne
Sie, dass Sie stattdessen einfach verwenden können!=
. In einem arithmetischen Kontext müssen wir nicht einmal$
Parametern voranstellen , dhfunktioniert einwandfrei. Dies gilt nicht für die
$?
speziellen Parameter.Da ferner
(( ... ))
Nicht-Null-Werte als wahr ausgewertet werden, dh einen Rückgabestatus von 0 für Nicht-Null-Werte und ansonsten einen Rückgabestatus von 1 haben, könnten wir auf verkürzenDies könnte jedoch mehr Menschen verwirren, als die gespeicherten Tastenanschläge wert sind.
Das
(( ... ))
Konstrukt ist in Bash verfügbar, wird jedoch von der POSIX-Shell-Spezifikation nicht benötigt (wird jedoch als mögliche Erweiterung erwähnt).Dies alles ist
$?
meiner Meinung nach besser zu vermeiden , wie in Coles Antwort und Stevens Antwort .quelle
(( ... ))
? POSIX Programmers Reference - Zusammengesetzte Befehle:)
Sie können einen ungleichen Vergleich verwenden,
-ne
anstatt-eq
:quelle