如何检查命令是否成功?

moa*_*a_u 324 command-line

有没有办法检查执行命令时是否有错误?

例子 :

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

  • 这是[对`test`的无用使用](http://www.smallo.ruhr.de/award.html#test)。 (4认同)
  • @Blauhirn `[ $? ]`(或等效的 `test $?`)不起作用,因为 `$?` 计算结果为非空的数字(0、1 等)。请参阅 [docs for `test`](https://www.gnu.org/software/coreutils/manual/html_node/test-invocation.html):“如果省略 EXPRESSION,'test' 返回 false。如果 EXPRESSION 是单个参数,如果参数为空,'test' 返回 false,否则返回 true。” (2认同)

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有更详细的解释。


小智 43

command && echo OK || echo Failed
Run Code Online (Sandbox Code Playgroud)


小智 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 之类的东西,这将变得有用,如果前一个命令失败,它将结束脚本。)


Ser*_*nyy 6

应该注意的是,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

command && echo $? || echo $?
Run Code Online (Sandbox Code Playgroud)


小智 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)

但它已经比第一个例子短不了多少了。