if tests the exit status of [. In the "if" branch, by definition, $? will be 0. It is the exit code of the command [ -s temp.txt ]. Yes, it is confusing to newbies that "open square bracket" is the name of a command, but that's what it is. You can call it test if you think that's less confusing.
Nope, you'll need to put the braces back in, sorry! (-:
rm file* rm tes* exit99 is a single command, it would try to remove file*, rm, tes*, and exit99. To put multiple commands on the same line, separate them with semicolons.
The braces are used when there are multiple commands you want to execute after || but you could also write this as an "if then else" if that's more convenient. Then it's easier to add commands, too.
if test -s file66.txt
then
mailx -s "file66.txt size zero" you@example.net </dev/null
exit 99
fi
echo "Shell script worked"
The braces and the semicolons are not necessary here, because everything up to "fi" (or "else") is executed when the condition matches. The || { stuff; } syntax is just basically a shorthand for when you want to cram stuff into a one-liner.
"exit" will always exit, the number is the result code returned by the script from which you exited. An exit code of zero conventionally means "no error", any other number is treated as an error. This doesn't really matter if you are simply ignoring the exit code; but returning a meaningful exit code is useful so that you can use the script from another script.
if yourscripthere; then
# your script did "exit" or "exit 0"
else
# your script did "exit 1" or some other nonzero number
# the precise number will be in $?
fi