Testbefehl in Unix druckt keine Ausgabe


20

Wenn ich das im Terminal eingebe

test 4 -lt 6

Ich bekomme keine Ausgabe. Warum nicht? Ich brauche die 0 oder 1


1
Wäre es nicht schön, wenn 'test' die Option hätte, sofort einen Wert auszugeben? Nur die Option. Das ist alles was wir brauchen würden.
Todd Walton

Antworten:


15

Sie erhalten 0 oder 1. Im Exitcode.

bash-4.2$ test 4 -lt 6

bash-4.2$ echo $?
0

bash-4.2$ test 4 -gt 6

bash-4.2$ echo $?
1

Update : Um den Exitcode für die spätere Verwendung zu speichern, weisen Sie ihn einfach einer Variablen zu:

bash-4.2$ test 4 -lt 6

bash-4.2$ first=$?

bash-4.2$ test 4 -gt 6

bash-4.2$ second=$?

bash-4.2$ echo "first test gave $first and the second $second"
first test gave 0 and the second 1

1
Gibt es eine Möglichkeit, den Exit-Code weiterzuleiten?
indieman

3
Nein, nur die Ausgabe kann umgeleitet werden. Normalerweise gibt es dafür keine Notwendigkeit. Um es für die spätere Verwendung zu speichern, weisen Sie es einfach einer Variablen zu. Oder sagen Sie uns, was genau Sie mit diesem Wert vorhaben.
Manatwork

2
Der Exit-Code wird in die $?Variable eingefügt - zumindest so lange, bis er vom nächsten ausgeführten Befehl überschrieben wird.
Shadur

1
PS: Sie können das $PIPESTATUSArray verwenden , um das Ergebnis mehrerer Befehle in einer Pipeline abzurufen. $?ist das Ergebnis des letzten Befehls in der Pipeline, wenn die pipefailOption deaktiviert ist (Standardeinstellung).
10b0

@indieman, wenn Sie basierend auf dem Beendigungsstatus etwas anderes tun müssen, müssen Sie es nicht einmal speichern - verwenden Sie einfachif test 4 -lt 6; then echo test succeeeded; else echo test failed; fi
Wildcard

5

Ein anderer Weg ist

test 4 -lt 6 && echo 1 || echo 0

Aber sei in diesem Fall vorsichtig. Wenn testerfolgreich zurückgegeben wird und echo 1fehlschlägt, echo 0wird ausgeführt.


2

Wenn Sie anstelle eines Exit-Codes das Ergebnis eines Standard-Out-Vergleichs erhalten möchten, können Sie den folgenden expr(1)Befehl verwenden:

$ expr 4 '<=' 6
1

Zwei Dinge zu beachten:

  1. Sie müssen wahrscheinlich den Operator angeben, da viele von ihnen mit Shell-Metazeichen in Konflikt stehen
  2. Der Ausgabewert ist das Gegenteil des Rückkehrcodes für test. testgibt 0 für true zurück (dies ist der Standard für Exit-Codes), gibt jedoch expr1 für true aus.

1
3. Es gibt eine testeingebaute Shell, die erheblich schneller ist (ungefähr 50-mal auf meinem Computer) als die ausführbaren Dateien testund expraus dem Paket coreutils .
Manatwork

+1 für den zweiten Punkt. Könnte einen Fehler bekommen, der sehr frustrierend ist, wenn Sie das vermasseln.
Emanuel Berg

2

Sie können den folgenden Befehl eingeben:

echo $(test -e myFile.txt) $?
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.