How to check if a command succeeded?
Is there any way to check if there is an error in executing a command?
Example :
test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1
function valid () {
if $test -eq 1; then
echo "OK"
else echo "ERROR"
fi
}
I already tried do that but it seems it isn't working. I don't how do that.
Solution 1:
The return value is stored in $?
. 0 indicates success, others indicates error.
some_command
if [ $? -eq 0 ]; then
echo OK
else
echo FAIL
fi
Like any other textual value, you can store it in a variable for future comparison:
some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
echo "Return code was not zero but $retval"
fi
For possible comparison operators, see man test
.
Solution 2:
If you only need to know if the command succeeded or failed, don't bother testing $?
, just test the command directly. E.g.:
if some_command; then
printf 'some_command succeeded\n'
else
printf 'some_command failed\n'
fi
And assigning the output to a variable doesn't change the return value (well, unless it behaves differently when stdout isn't a terminal of course).
if output=$(some_command); then
printf 'some_command succeded, the output was «%s»\n' "$output"
fi
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals explains if
in more detail.
Solution 3:
command && echo OK || echo Failed
Solution 4:
$? should contain the exit status of the previous command, which should be zero for no error.
So, something like;
cd /nonexistant
if [ $? -ne 0 ]
then
echo failed
else
echo success!
fi
for most cases, it's easier to use the && construct to chain commands that need to depend on each other. So cd /nonexistant && echo success!
would not echo success because the command breaks before &&. The corollary of this is ||, where cd /nonexistant || echo fail
would echo fail because cd failed. (this becomes useful if you use something like ||exit, which will end the script if the previous command failed.)
Solution 5:
It should be noted that if...then...fi
and &&
/||
type of approach deals with exit status returned by command we want to test( 0 on success ); however, some commands don't return a non-zero exit status if command failed or couldn't deal with input. This means that the usual if
and &&
/||
approaches won't work for those particular commands.
For instance, on Linux GNU file
still exits with 0 if it received a non-existing file as argument and find
couldn't locate the file user specified.
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
In such cases, one potential way we could handle the situation is by reading stderr
/stdin
messages, e.g. those that returned by file
command, or parse output of the command like in find
. For that purposes, case
statement could be used.
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
( This is a repost of my own answer on related question at unix.stackexchange.com )