How to use $? and test to check function?

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

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.