示例:
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
}
我已经尝试过执行此操作,但是它似乎没有用。我不怎么做
#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,否则为失败。
评论
最好将$(foo)放在反引号`foo`上,因为您可以将其嵌套,并且更容易与撇号区分开。顺便说一句,在调用它之前,您需要定义一个函数(有效)。
相关:SC2015:请注意A && B || C不是if-then-else。当A为真时,C可能会运行。