我正在测试我的shell脚本和python脚本,所以我编写了一个shell脚本来循环调用这两个脚本:
while ((1)) ; do
/usr/local/bin/ovs-appctl dpdk/vhost-list
sleep 10
/usr/local/bin/ovs-appctl dpdk/virtio-net-show n-f879ac2f
sleep 10
/usr/local/bin/ovs-appctl dpdk/virtio-net-show n-434ab558
sleep 10
/usr/local/bin/ovs-appctl dpdk/virtio-net-show i-brpri-p
sleep 10
`sh ./env_check`
`cat output.txt`
sleep 10
`python vm_qga_tool /opt/cloud/workspace/servers/6608da87-e374-4796-adb1-8faa29f49e9a/qga.sock connect:172.16.0.1`
sleep 10
done
但结果报告错误:
test-dpdk-virtio-net-show.sh: line 13: Checking: command not found
test-dpdk-virtio-net-show.sh: line 15: {"session":: command not found
第13行是cat output.txt
,第15行是python vm_qga_tool ...
。
output.txt是第12行sh ./env_check
的结果,vm_qga_tool
的输出是这样的:
{"session"...
那么如何解决这个问题呢?如何在shell脚本中捕获shell脚本的结果?
答案 0 :(得分:2)
sh ./env_check
行将替换为脚本./env_check
的输出。当前shell将尝试将它们作为命令执行。在你的情况下它失败了,因为,幸运,bash无法将它们解释为命令。这可能是一场灾难。例如,如果您的脚本生成类似rm -rf *
的输出,您可以想象会发生什么。
如果您想显示./env_check
的结果,则必须在echo
之前添加一行,以便将./env_check
的输出反馈给回声。
echo `sh ./env_check`
或者,如果您想将输出捕获到变量中,请执行以下操作。
out=`sh ./env_check`
同样适用于cat ...
和python ...
但不鼓励使用反蜱。而是使用$(...)
。 (Read more here.)
...
sleep 10
echo $(sh ./env_check)
echo $(cat output.txt)
sleep 10
echo $(python vm_qga_tool /opt/cloud/workspace/servers/6608da87-e374-4796-adb1-8faa29f49e9a/qga.sock connect:172.16.0.1)
sleep 10
...
但是,无论如何你都不需要这样做。如果您不需要捕获命令输出,则可以直接调用脚本,而不是通过子shell调用。
...
sleep 10
sh ./env_check
cat output.txt
sleep 10
python vm_qga_tool /opt/cloud/workspace/servers/6608da87-e374-4796-adb1-8faa29f49e9a/qga.sock connect:172.16.0.1
sleep 10
...
答案 1 :(得分:0)
出现问题是因为您的shell接受sh ./env_check
和python vm_qga_tool ...
的输出作为命令,因此它将尝试运行这些命令。
要修复它,你应该消除" " symbol from
sh ./env_check or
}} {@ {{{{{{