Il comando di test in unix non stampa un output


20

Quando scrivo questo nel terminale

test 4 -lt 6

Non ho alcun output. Perchè no? Ho bisogno di quello 0 o 1


1
Non sarebbe bello se 'test' avesse un'opzione per produrre immediatamente un valore? Solo l'opzione. Questo è tutto ciò di cui avremmo bisogno.
Todd Walton,

Risposte:


15

Ottieni 0 o 1. Nel codice di uscita.

bash-4.2$ test 4 -lt 6

bash-4.2$ echo $?
0

bash-4.2$ test 4 -gt 6

bash-4.2$ echo $?
1

Aggiornamento : per memorizzare il codice di uscita per un uso successivo, assegnarlo a una variabile:

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
c'è un modo per convogliare il codice di uscita?
indieman,

3
No. Solo l'output può essere reindirizzato. Comunque, di solito non ce n'è bisogno. Per memorizzarlo per un uso successivo, basta assegnarlo a una variabile. Oppure dicci qual è esattamente la tua intenzione con quel valore.
Manatwork

2
Il codice di uscita viene inserito nella $?variabile, almeno fino a quando non viene sovrascritto dal comando successivo che si esegue.
Shadur,

1
PS: è possibile utilizzare l' $PIPESTATUSarray per ottenere il risultato di più comandi in una pipeline. $?sarà il risultato dell'ultimo comando nella pipeline se l' pipefailopzione è disattivata (impostazione predefinita).
l0b0

@indieman, se quello che ti serve è fare qualcos'altro in base allo stato di uscita, non hai nemmeno bisogno di salvarlo - basta usareif test 4 -lt 6; then echo test succeeeded; else echo test failed; fi
Wildcard

5

Un altro modo è

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

Ma fai attenzione in quel caso. Se testrestituisce esito positivo e echo 1fallito echo 0verrà eseguito.


2

Se si desidera il risultato di un confronto su standard out anziché un codice di uscita, è possibile utilizzare il expr(1)comando:

$ expr 4 '<=' 6
1

Due cose da notare:

  1. probabilmente dovrai citare l'operatore poiché molti di loro sono in conflitto con i metacaratteri della shell
  2. il valore di output è l'opposto del codice di ritorno per test. testrestituisce 0 per true (che è lo standard per i codici di uscita), ma exprstampa 1 per true.

1
3. Esiste un testbuilt-in della shell, che è considerevolmente più veloce (circa 50 volte sulla mia macchina) rispetto agli eseguibili teste exprdal pacchetto coreutils .
arte

+1 per il secondo punto. Potrebbe ottenere un bug che è molto frustrante da trovare se lo rovini.
Emanuel Berg,

2

È possibile digitare il seguente comando:

echo $(test -e myFile.txt) $?
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.