Polecenie testowe w systemie Unix nie drukuje wyniku

20

Kiedy piszę to w terminalu

test 4 -lt 6

Nie otrzymuję żadnych danych wyjściowych. Dlaczego nie? Potrzebuję tego 0 lub 1

indieman
źródło
1
Czy nie byłoby miło, gdyby „test” miał opcję natychmiastowego wyprowadzenia wartości? Po prostu opcja. To wszystko, czego potrzebowalibyśmy.
Todd Walton,

Odpowiedzi:

15

Dostajesz 0 lub 1. W kodzie wyjścia.

bash-4.2$ test 4 -lt 6

bash-4.2$ echo $?
0

bash-4.2$ test 4 -gt 6

bash-4.2$ echo $?
1

Aktualizacja : Aby zapisać kod wyjścia do późniejszego wykorzystania, wystarczy przypisać go do zmiennej:

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
człowiek w pracy
źródło
1
czy istnieje sposób na potokowanie kodu wyjścia?
indieman
3
Nie. Można przekierowywać tylko dane wyjściowe. W każdym razie zazwyczaj nie ma takiej potrzeby. Aby zapisać go do późniejszego wykorzystania, wystarczy przypisać go do zmiennej. Lub powiedz nam, jaki dokładnie jest twój zamiar z tą wartością.
manatwork
2
Kod wyjścia jest umieszczany w $?zmiennej - przynajmniej dopóki nie zostanie zastąpiony przez następne wykonywane polecenie.
Shadur
1
PS: Można korzystać z $PIPESTATUStablicy , aby uzyskać wynik wielu poleceń w rurociągu. $?będzie przez wynikać z ostatniego polecenia w rurociągu, jeżeli opcja jest wyłączona (ustawienie domyślne). pipefail
l0b0,
@ indieman, jeśli potrzebujesz zrobić coś innego w oparciu o status wyjścia, nawet nie musisz go zapisywać - po prostu użyjif test 4 -lt 6; then echo test succeeeded; else echo test failed; fi
Wildcard
5

Innym sposobem jest

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

Ale bądź ostrożny w takim przypadku. Jeśli testzwroty zakończą się sukcesem i zakończą się echo 1niepowodzeniem, echo 0zostaną wykonane.

pośpiech
źródło
2

Jeśli chcesz uzyskać wynik porównania standardowego wyjścia zamiast kodu wyjścia, możesz użyć expr(1)polecenia:

$ expr 4 '<=' 6
1

Dwie rzeczy do zapamiętania:

  1. prawdopodobnie będziesz musiał zacytować operatora, ponieważ wiele z nich powoduje konflikt z metaznakami powłoki
  2. wartość wyjściowa jest przeciwieństwem kodu powrotu dla test. testzwraca 0 dla true (co jest standardem dla kodów wyjścia), ale exprdrukuje 1 dla true.
camh
źródło
1
3. Jest testwbudowana powłoka, która jest znacznie szybsza (około 50 razy na mojej maszynie) niż testi exprpliki wykonywalne z pakietu coreutils .
manatwork
+1 za drugi punkt. Może pojawić się błąd, który jest bardzo frustrujący, jeśli go zepsujesz.
Emanuel Berg,
2

Możesz wpisać następujące polecenie:

echo $(test -e myFile.txt) $?
MCH
źródło