Letzter Befehl in einer Schleife ist erfolgreich, aber der Beendigungsstatus ist 1

0

Warum gibt das Folgende 1, wenn ich es tue echo $??

#!/bin/bash  
echo "two">file.txt  
ARRAY=(one three two)  
rc=0  
for i in ${ARRAY[@]}; do  
    echo "grepping $i "  
    grep "$i" file.txt || rc=$?  
done  
exit $rc  

Der letzte Befehl ist erfolgreich, da es grepfür ist two.
Die Ausgabe ist:

grepping one 
grepping three   
grepping two   
two  
~$ echo $?  
1  

Ich habe mit 0 gerechnet. Beachten Sie, dass ich rc als 1 erhalten möchte, wenn ein Befehl in der Schleife fehlschlägt. Aber ich möchte verstehen, warum dies in diesem Fall geschieht

Jim
quelle

Antworten:

2

Der letzte Befehl ist möglicherweise erfolgreich, aber Sie speichern nur den Exit-Status von fehlgeschlagenen greps to rc. Wenn also einer der Bäume grepausfällt, wird Ihr Skript mit einem Beendigungsstatus ungleich Null beendet.

Kusalananda
quelle
Ah, perfekt, das ist was ich brauche.
Jim
@ Jim gut! Wenn dies Ihr Problem löst, ziehen Sie bitte in Betracht , die Antwort zu akzeptieren .
Kusalananda
Würde set -eauch das erreichen, wonach ich suche?
Jim
@Jim Using set -ewürde das Skript beenden, sobald der erste grepnichts findet. Wenn du das willst, dann ok.
Kusalananda
Ich möchte das aber auch eine Fehlermeldung ausgeben, um den Grund zu zeigen
Jim