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

dot*_*dot 3 scripting python shell-script busybox

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

当我尝试以这种方式运行它时,它可以工作:

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

if [ $result -gt 0 ];
    then echo 'PROBLEM';
else
    echo 'OK';
fi
Run Code Online (Sandbox Code Playgroud)

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

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

它返回:

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK
Run Code Online (Sandbox Code Playgroud)

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

到目前为止我尝试过的

if [ $(/usr/bin/python /etc/scripts/backup.py) -ne 0 ];
Run Code Online (Sandbox Code Playgroud)

返回

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

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

它返回:

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: out of range
OK
Run Code Online (Sandbox Code Playgroud)

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

谢谢。

Kus*_*nda 6

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

相反,只是做

#!/bin/sh

if ! /usr/bin/python /etc/scripts/backup.py; then
   echo 'PROBLEM'
else
   echo 'OK'
fi
Run Code Online (Sandbox Code Playgroud)

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

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

如果你想摆脱!

#!/bin/sh

if /usr/bin/python /etc/scripts/backup.py; then
   echo 'OK'
else
   echo 'PROBLEM'
fi
Run Code Online (Sandbox Code Playgroud)

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


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

if [ -gt 0 ]
Run Code Online (Sandbox Code Playgroud)

这是一个语法错误。

在引用命令替换时,您实际上是在尝试运行

if [ "" -gt 0 ]
Run Code Online (Sandbox Code Playgroud)

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