我需要编写一个小的 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 手册页所示。