使用 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)}'
您好,我正在使用此脚本在执行操作之前检查虚拟机是否 运行
#!/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)}'