有没有办法检查执行命令时是否有错误?
例子 :
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
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这样做,但似乎不起作用。我不知道怎么做
Lek*_*eyn 472
返回值存储在$?
. 0 表示成功,其他表示错误。
some_command
if [ $? -eq 0 ]; then
echo OK
else
echo FAIL
fi
Run Code Online (Sandbox Code Playgroud)
与任何其他文本值一样,您可以将其存储在变量中以供将来比较:
some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
echo "Return code was not zero but $retval"
fi
Run Code Online (Sandbox Code Playgroud)
有关可能的比较运算符,请参阅man test
。
gei*_*rha 111
如果你只需要知道命令是成功还是失败,不用费心测试$?
,直接测试命令即可。例如:
if some_command; then
printf 'some_command succeeded\n'
else
printf 'some_command failed\n'
fi
Run Code Online (Sandbox Code Playgroud)
并且将输出分配给变量不会改变返回值(好吧,除非当 stdout 当然不是终端时它的行为有所不同)。
if output=$(some_command); then
printf 'some_command succeded, the output was «%s»\n' "$output"
fi
Run Code Online (Sandbox Code Playgroud)
http://mywiki.wooledge.org/BashGuide/TestsAndConditionalsif
有更详细的解释。
小智 22
$? 应该包含上一个命令的退出状态,如果没有错误,它应该为零。
所以,就像;
cd /nonexistant
if [ $? -ne 0 ]
then
echo failed
else
echo success!
fi
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,使用 && 构造来链接需要相互依赖的命令会更容易。因此,cd /nonexistant && echo success!
将不会因为之前的命令符&&呼应成功。其推论是 ||,哪里cd /nonexistant || echo fail
会因为 cd 失败而导致echo 失败。(如果您使用 ||exit 之类的东西,这将变得有用,如果前一个命令失败,它将结束脚本。)
应该注意的是,if...then...fi
和&&
/||
类型的方法处理我们要测试的命令返回的退出状态(成功时为 0);但是,如果命令失败或无法处理输入,某些命令不会返回非零退出状态。这意味着通常的if
和&&
/||
方法不适用于这些特定命令。
例如,在 Linux 上file
,如果GNU接收到一个不存在的文件作为参数并且find
找不到用户指定的文件,它仍然会以 0 退出。
$ 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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们可以处理这种情况的一种潜在方法是读取stderr
/stdin
消息,例如那些由file
命令返回的消息,或者像 in 解析命令的输出find
。为此,case
可以使用语句。
$ 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
Run Code Online (Sandbox Code Playgroud)
(这是我自己在 unix.stackexchange.com上对相关问题的回答的转贴)
小智 5
正如许多其他答案中提到的,一个简单的测试$?
就可以了,就像这样
if [ $? -eq 0 ]; then something; fi
Run Code Online (Sandbox Code Playgroud)
如果您想测试命令是否失败,您可以使用较短的版本bash
(但可能有点过分),如下所示:
if (($?)); then something; fi
Run Code Online (Sandbox Code Playgroud)
这是通过使用(( ))
算术模式来工作的,因此如果命令返回success
,$? = 0
即测试将评估((0))
哪些测试为false
,否则它将返回true
。
要测试是否成功,您可以使用:
if ! (($?)); then something; fi
Run Code Online (Sandbox Code Playgroud)
但它已经比第一个例子短不了多少了。