Unix shell脚本:以返回值退出

5
我有以下的Unix Shell脚本,其中我有两个整数变量a和b。
如果a大于或等于b,则Shell脚本应该退出并返回0。
否则,它应该退出并返回1。
我的尝试:
脚本:ConditionTest.sh
#!/bin/sh

a=10
b=20

if [ $a -ge $b ]
then
        exit 0
else
        exit 1
fi
    ....
    ....
    ....

运行脚本:

$ ./ConditionTest.sh
$ 

注意: 执行文件后我没有得到任何返回值。


1
退出值存储在 $? 中。运行脚本后执行 echo $?。如果您想将该值作为脚本输出的一部分显示,则打印它:echo 0; exit 0echo 1; exit 1 - P.P
1
“获取任何返回值” 对于您来说意味着“没有打印的值”吗? - Jdamian
3个回答

7

Shell会将最后一个命令的退出状态放入变量?中。您可以简单地检查它:

mycommand
echo $?

…或者您可以根据其值使用它来执行其他操作:

mycommand && echo "ok" || echo "failed"

或者,稍微更易读一些的方式是:
if mycommand; then
  # exit with 0
  echo "ok"
else
  # exit with non-zero
  echo "failed"
if

1
我有点挑剔,$? 扩展的是值,而不是变量。变量被称为 ? - cdarke
@cdarke 没错!我会修改我的答案。 - Kusalananda

4
你的脚本看起来很好,你做得很正确。
#!/bin/sh

a=10
b=20

if [ $a -ge $b ]
then
        exit 0
else
        exit 1
fi

接下来我们运行它并检查返回值:

$ sh test.sh
$ echo $?
1
$

10不大于或等于20。

另一种测试方式是这样的:

$ sh test.sh && echo "succeeded" || echo "failed"
failed

如评论中所提到的,你始终应该引用你的变量:

if [ $a -ge $b ]

Should be:

if [ "$a" -ge "$b" ]

1
小改进:始终在变量周围使用双引号。 "$a" -ge "$b"。否则,当变量为空时,会得到难以在代码中发现的平均语法错误。 - allo
注意到编辑(并且同意;我总是这样做)。我最初只是复制并粘贴了OP的代码。 - Will

1
补充之前的回答,你需要理解的关键思想是每个程序在退出时都会提供一个数字。该数字用作报告命令是否已成功完成其操作以及如果没有,发生了什么类型的错误的方式。
如上所述,上次执行的命令的退出代码可以使用$?进行访问。
你的脚本没有打印任何内容的原因是你的脚本返回了1,但是命令的退出代码没有被打印出来。(这类似于调用函数,你从函数中得到一个返回值,但它并没有被打印出来)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接