This doesn't check for the previous command's exit code, but for the count of positional parameters. When calling the script without arguments, you'll branch into the then construct. Try if [ $? == 0 ] instead, but be aware that $? is being overwritten by every single new command...