使用 virsh 和 grep 检查虚拟机状态是否为 运行 - 当虚拟机名称具有 space 时不工作

Checking if a vm status is running using virsh and grep - not working when vm name has a space

您好,我正在使用此脚本在执行操作之前检查虚拟机是否 运行

#!/bin/bash
vm="PopOS VNC"
vmstate=$(virsh list --all | grep " $vm " | awk '{ print }')

if [ "$vmstate" == "x" ] || [ "$vmstate" != "running" ]
then
    echo "VM is shut down" 
else
    echo "VM is running!"
fi

当 vm 为 运行 但 vm 变量具有 space 时,脚本无法按预期工作

vm="PopOS VNC"

对于 VM 运行,vmstate 的值是“VNC”而不是预期的“运行”

虚拟机停止时值仍然是“VNC”

然而,对于没有 space 的虚拟机名称,它可以按预期工作(如下所示)

vm="CentOS10"

对于 VM 运行,vmstate 的值是预期的“运行”。

随着 VM 关闭,值如预期的那样“关闭”

请有人告诉我如何让它与名称中有 space 的虚拟机一起工作。

非常感谢:)

编辑 virsh 列表的输出 --all

 Id   Name                  State
--------------------------------------
 -    Big Sur               shut off
 -    True NAS              shut off
 -    CentOS10              shut off
 -    Debian-10             shut off
 -    dos_6.22              shut off
 -    Windows 95            shut off
 -    Gparted Live          shut off
 -    Popos AMD gpu         shut off
 -    PopOS VNC             shut off
 -    OpenSUSE              shut off
 -    Windows 98 VNC        shut off
 -    OpenSUSE2             shut off
 -    pfSense               shut off

使用集合 x 的脚本输出

+ vm='PopOS VNC'
++ virsh list --all
++ awk '{ print }'
++ grep ' PopOS VNC '
+ vmstate=VNC
+ '[' VNC == x ']'
+ '[' VNC '!=' running ']'
+ echo 'VM is shut down'
VM is shut down
+ set +x

我假设引号 "' 或两者都有问题。

为了调试您的脚本并查看 shell 的实际命令扩展,我使用 set -x 启动命令 echo 并使用 set +x 停止命令 echo。

建议运行以下脚本:

#!/bin/bash
set -x
vm="PopOS VNC"
vmstate=$(virsh list --all | grep " $vm " | awk '{ print }')

if [ "$vmstate" == "x" ] || [ "$vmstate" != "running" ]
then
    echo "VM is shut down" 
else
    echo "VM is running!"
fi
set +x

我假设 grep " $vm "

中的变量扩展存在问题

请post你的结果在post。

此外请记住 awk 默认字段分隔符是 。当您的 $vm 是 2 个字时,所需的 awk 字段右移到:awk '{ print }',如果 $vm 是 3 个字,则所需的 awk 字段是 awk '{ print }'.

也许还是接最后一句比较好awk '{ print $NF}'

或者在最后一个词前取一个词awk '{ print $(NF - 1)}'