有什么方法可以检查执行命令是否出错?

示例:

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
}


我已经尝试过执行此操作,但是它似乎没有用。我不怎么做

评论

最好将$(foo)放在反引号`foo`上,因为您可以将其嵌套,并且更容易与撇号区分开。

顺便说一句,在调用它之前,您需要定义一个函数(有效)。

相关:SC2015:请注意A && B || C不是if-then-else。当A为真时,C可能会运行。

#1 楼

返回值存储在$?中。 0表示成功,其他表示错误。

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi


与其他任何文本值一样,您可以将其存储在变量中以供将来比较:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi


有关可能的比较运算符,请参见man test

评论


很好...我可以保留输出错误吗?? !! ,因为在这种情况下我有2个错误:例如,命令错误“文本” ex,找不到文件,而我的错误“文本”例如在这种情况下失败

– moata_u
2011年3月7日在12:28

@moata_u:您可以将值存储在变量中,如我的答案所示。

– Lekensteyn
2011年7月7日13:14

@moata_u:您需要输入;在else和fi之前:`if ...;然后 ...;否则...;科幻

– Lekensteyn
2011-3-7 14:36

这是无用的测试。

–大卫·福斯特(David Foerster)
2014年12月1日22:04

@Blauhirn [$? ](或等效地,测试$?)不起作用,因为$?计算结果为不为null的数字(0、1等)。请参阅文档进行测试:“如果省略了EXPRESSION,则'test'返回false。如果EXPRESSION是单个参数,则如果参数为null,则'test'返回false,否则返回true。”

– Lekensteyn
16 Mar 25 '16 at 18:31

#2 楼

如果您只需要知道命令是成功还是失败,就不必费心测试$?,只需直接测试命令即可。例如:

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi


并将输出分配给变量不会改变返回值(好吧,除非当stdout当然不是终端时它的行为不同) 。

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi


http://mywiki.wooledge.org/BashGuide/TestsAndConditionals详细解释了if

评论


如果您想要执行分支以外的其他操作(例如将是否失败的布尔值存储到.ini中)怎么办?然后,您的输出变量不会执行此操作,而是$?确实如此,所以您说直接测试该命令绝对更好是不正确的。

–提摩西·天鹅
17年11月30日在15:53

当使用本地命令时,将输出分配给变量可能会更改返回值,即local foo = $(false);回声$ ?;在输出上产生0。但是local仅在bash函数内部相关。

– Cromax
19年1月22日13:45



我似乎无法在变量示例中使用else。知道为什么吗?

–普罗米修斯
20-09-21在22:26

@Prometheus不看代码很难说。在您认为失败的情况下,它可能错误地返回0,或者您在命令替换中添加了其他命令,而没有在它们之间使用&&。

– Geirha
20-09-22在20:06

#3 楼

command && echo OK || echo Failed


评论


如果命令在屏幕上返回错误,如何将其隐藏?

– Sigur
17年4月21日在1:51

如果命令将错误写出到stderr,则可以使用以下命令:2> / dev / null && echo OK ||回声失败。 2> / dev / null将stderr输出重定向到/ dev / null。但是,某些实用程序会将错误写入stdout(即使这是错误的做法)。在这种情况下,您可以从重定向中省略2,但是您将丢失该命令的任何输出。这种检查成功的方法适用于简单的三元逻辑,但对于更复杂的行为,最好检查$?命令成功,或使用@geirha的答案中概述的if块方法。

–本德最大
17年7月24日在13:27



请注意,这并非在所有情况下都保存。参见:github.com/koalaman/shellcheck/wiki/SC2015

– Tobias Gaertner
20年4月14日在12:25

#4 楼

$?应该包含前一个命令的退出状态,应为零,表示没有错误。

所以,类似这样;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi


对于大多数情况下,使用&&构造链接需要相互依赖的命令会更容易。因此,由于命令在&&之前中断,因此cd /nonexistant && echo success!不会回显成功。结果是||,其中cd /nonexistant || echo fail将回显失败,因为cd失败。 (如果使用|| exit之类的东西,这将很有用,如果上一条命令失败,它将结束脚本。)

评论


很好...我可以保留输出错误吗?? !! ,因为在这种情况下我有2个错误:例如,命令错误“文本” ex,找不到文件,而我的错误“文本”例如在这种情况下失败

– moata_u
2011-3-7在12:24



@moata_u,请参见mywiki.wooledge.org/BashFAQ/002

– Geirha
11年8月8日在23:55

#5 楼

应该注意,if...then...fi&& / ||类型的方法处理我们要测试的命令返回的退出状态(成功时为0);但是,如果命令失败或无法处理输入,则某些命令不会返回非零退出状态。这意味着通常的if&& / ||方法不适用于这些特定命令。例如,在Linux上,如果GNU file接收到不存在的文件作为自变量,并且仍然以0退出。 find找不到用户指定的文件。

$ 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


在这种情况下,我们可以通过以下方法处理这种情况:读取stderr / stdin消息,例如由file命令返回的代码,或者像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



(这是我对unix.stackexchange.com上相关问题的回答的转贴)

#6 楼

command && echo $? || echo $?


评论


你的意思是命令;回声$? ?

–哈维尔·巴齐(Javier Buzzi)
18年11月16日在10:32

不,我的行是正确的,无论成功或失败,它都会以数字形式给出实际结果代码。

– modrobert
18-11-20在20:07



好吧,请向我解释这些区别:true && echo $? ||回声$? / true;回声$?和false && echo $? ||回声$? / false;回声$? -您会发现,他们做的完全相同:D

–哈维尔·巴齐(Javier Buzzi)
18年11月21日在11:07

是的,结果相同,但没有条件。最初询问的问题是“如何检查命令是否成功?”,这是基于先前的答案。我猜一个更好的例子是:command && echo“ success:$?” ||回声“失败:$?”

– modrobert
18年11月22日在8:16

#7 楼

如许多其他答案中所述,可以对$?进行简单的测试,就像这样

if [ $? -eq 0 ]; then something; fi


如果要测试命令是否失败,可以使用较短的版本在bash中(但可能会过大),如下所示: (( ))测试为success,否则将返回$? = 0。要测试是否成功,可以使用:

if (($?)); then something; fi


,但是它不是比第一个示例短得多。

#8 楼

为了更方便地调试,我使用以下命令制作仅输出错误的命令:

so [-tag] [命令]

之后是$?如果成功则为0,否则为失败。