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!"

The output of executing the script:

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

There's a simpler way of what you're doing. If you use set -x, the script will automatically echo each line before it's executed.

Also, as soon as you execute another command, $? is replaced with the exit code of that command.

You'll have to back it up to a variable if you're going to be doing anything with it other than a quick test-and-forget. The [ is actually a program that has its own exit code.

For example:

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
  • the if statement is what i was looking for – northern-bradley Aug 28 '18 at 12:00
3

Looks to me like the command test "$?" != "0" ends up setting $? to 1. The value $? gets used in the arguments to test. test sets $? to a non-zero value because "0" is lexically equal to "0". The "!=" makes test return non-zero.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.