Bourne: if statement testing exit status
What is the difference:
if IsServerStarted ; then ...
开发者_Python百科and
if [ IsServerStarted -eq 0 ] ; then ...
Seems to me that these two statements should be equivalent? Strangely the second statement is always true.
The following runs the shell function or executable in $PATH
named IsServerStarted
, and if its exit code is 0
(i.e. true), runs the then
branch. If such a function or executable does not exist, the exit code will be non-0
(i.e. false) and the then
branch will be skipped.
if IsServerStarted ; then ...
The following has [
(aka test
) check whether IsServerStarted
is an integer equal to 0
, which (IsServerStarted
not even containing a single digit) is always false. Thus, [
exits with a non-0
(i.e. false) code and the then
branch is always skipped.
if [ IsServerStarted -eq 0 ] ; then ...
Actually, the second one will give an error complaining that "IsServerStarted" is not a valid integer. It's considered a string constant so something like
var="IsServerStarted"
if [ IsServerStarted == "$var" ] ; then
would succeed (or fail if it wasn't equal).
ndim is correct regarding the executable or function in the first example you gave.
A couple more variations to consider:
if $IsServerStarted ; then ...
In that one, the if
is evaluated based on the return value of a command (executable or function) that is contained in the variable IsServerStarted
. So you could set IsServerStarted=true
and then the if
would succeed since true
is a shell builtin that always returns true. You could set IsServerStarted='grep popsicle freezer' and the
if` would pass or fail depending on whether you were out of treats.
if [ $IsServerStarted -eq 0 ]; then ...
This simply tests whether the variable is equal to zero. If it's not a valid integer it will cause an error message.
精彩评论