Wie benutzt man $? und testen, um die Funktion zu überprüfen?

7
    #!/bin/sh

function checkExit(){
    if test "$?" != "0"; then
      echo Command $1 exited with abnormal status
      exit 1;
    else echo $?
    fi
}

function echoThenRun () { # echo and then run the command
  echo $1
  $1
  ret=$?
  echo $ret
  return $ret
}
file=test_file
echo > $file
echoThenRun "test -f $file"
checkExit $file
echo "all right!"

Die Ausgabe der Ausführung des Skripts:

$  ~/Downloads/test.sh 
test -f test_file
0
1 # why 1 here??
all right!
sympathisch
quelle

Antworten:

11

Es gibt einen einfacheren Weg, was Sie tun. Wenn Sie verwenden set -x, gibt das Skript automatisch jede Zeile wieder, bevor es ausgeführt wird.

Sobald Sie einen anderen Befehl ausführen, $?wird dieser durch den Exit-Code dieses Befehls ersetzt.

Sie müssen es in einer Variablen sichern, wenn Sie etwas anderes damit machen wollen als ein schnelles Testen und Vergessen. Das [ist eigentlich ein Programm, das einen eigenen Exit-Code hat.

Zum Beispiel:

set -x # make sure the command echos
execute some command...
result="$?"
set +x # undo command echoing
if [ "$result" -ne 0 ]; then
    echo "Your command exited with non-zero status $result"
fi
Amphetamachine
quelle
Die ifAussage ist, wonach ich gesucht habe
Northern Bradley
omg warum mir vorher niemand gesagt hat das set -xexistiert !!! Das ist die nützlichste Funktion aller Zeiten. Vielen Dank!
Michal Artazov
3

Sieht für mich so aus, als würde der Befehl test "$?" != "0"$ setzen? zu 1. Der Wert $? wird in den Argumenten zu verwendet test. testsetzt $? auf einen Wert ungleich Null, da "0" lexikalisch gleich "0" ist. Das "! =" Macht die testRückgabe ungleich Null.

Bruce Ediger
quelle