busybox shell 脚本 - 未知操作数错误消息

busybox shell 脚本 - 未知操作数错误消息

我需要编写一个小的 shell 脚本来执行 python 脚本并获取结果。

当我尝试以这种方式运行它时,它会起作用:

#!/bin/sh
/usr/bin/python /etc/scripts/backup.py
result=$?

if [ $result -gt 0 ];
    then echo 'PROBLEM';
else
    echo 'OK';
fi

但如果我尝试这样做,就会失败:

#!/bin/sh
if [ $(/usr/bin/python /etc/scripts/backup.py) -gt 0 ];
    then echo 'PROBLEM';
else
    echo 'OK';
fi

它返回:

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK

结果是错误的。它应该打印“PROBLEM”而不是“OK”。

到目前为止我尝试过什么

if [ $(/usr/bin/python /etc/scripts/backup.py) -ne 0 ];

回报

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK

我也尝试过这个:

if [ "$(/usr/bin/python /etc/scripts/backup.py)" -gt 0 ];

它返回:

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: out of range
OK

有人能指出我正确的方向吗?

谢谢。

答案1

命令不会$?在标准输出上返回其退出状态 ( )。命令替换 ( $(...)) 捕获标准输出。

相反,只需做

#!/bin/sh

if ! /usr/bin/python /etc/scripts/backup.py; then
   echo 'PROBLEM'
else
   echo 'OK'
fi

PROBLEM如果 python 脚本以非零退出状态退出,这将选择第一个分支并打印。

您可以将该if语句理解为“如果脚本没有成功”。

如果你想摆脱!

#!/bin/sh

if /usr/bin/python /etc/scripts/backup.py; then
   echo 'OK'
else
   echo 'PROBLEM'
fi

您可以将该if语句解读为“如果脚本确实成功”。


错误您得到的结果来自脚本不输出任何内容的事实,这意味着命令替换将为空。由于它没有被引用,因此 shell 将尝试执行的命令如下所示

if [ -gt 0 ]

这是一个语法错误。

当引用命令替换时,您本质上是尝试运行

if [ "" -gt 0 ]

并且 shell 无法将空字符串作为整数进行比较。

答案2

正如 Kusalananda 所示,你只需要使用

if cmd; then
    echo "command succeeded"
else
    echo "command failed: $?"
fi

在一个更具说明性的示例中,您可以运行这样的命令来查看对于 'if'、'while' 以及 shell 命令结构中的其他逻辑比较,非零退出代码为何为“假”,而 0 退出代码为何为真。

$ if (exit 3); then echo succeeded ; else echo failed $?;fi
failed 3
$ if (exit 0); then echo succeeded ; else echo failed $?;fi
succeeded
$ 

while 循环的工作原理如下所示:

$ i=3;while ! (exit $i); do echo failed $i; ((i--));done
failed 3
failed 2
failed 1
$ 

这可用于重试连接失败的命令,或者需要重试直到成功。

使用 (exit ...) 将该命令作为单独的进程运行。对于内置 shell 命令,需要这样做才能防止运行脚本的 shell 实例退出。相反,shell 创建一个子进程,它的退出代码提供 $? 的值。如 shell 手册页所示。

相关内容