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)
有人可以指出我正确的方向吗?
谢谢。
命令不会$?在标准输出上返回其退出状态 ( )。命令替换 ( $(...)) 捕获标准输出。
相反,只是做
#!/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)
并且外壳无法将空字符串作为整数进行比较。