嗨,在执行操作之前,我使用这个脚本来检查vm是否正在运行。
#!/bin/bash
vm="PopOS VNC"
vmstate=$(virsh list --all | grep " $vm " | awk '{ print $3}')
if [ "$vmstate" == "x" ] || [ "$vmstate" != "running" ]
then
echo "VM is shut down"
else
echo "VM is running!"
fi当vm正在运行,但vm变量有一个空格时,脚本不像预期的那样工作
vm="PopOS VNC"在VM运行时,vmstate的值是"VNC“,而不是预期的”运行“。
使用vm停止的值仍然是"VNC“。
但是,对于没有空格的vm名称,它的工作方式与预期的一样(如下所示)
vm="CentOS10"在VM运行时,vmstate的值正按预期“运行”。
当VM关闭时,值将如预期的那样“关闭”。
请有人告诉我,如何使它与一个vm工作,其中有一个空格的名称。
非常感谢:)
编辑virsh列表的输出--所有
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使用set x输出脚本
+ vm='PopOS VNC'
++ virsh list --all
++ awk '{ print $3}'
++ grep ' PopOS VNC '
+ vmstate=VNC
+ '[' VNC == x ']'
+ '[' VNC '!=' running ']'
+ echo 'VM is shut down'
VM is shut down
+ set +x发布于 2022-02-20 19:08:02
我想引号"或'或两者都有问题。
为了调试脚本并查看实际的shell命令扩展,我使用set -x启动命令echo,使用set +x停止命令回显。
建议运行以下脚本:
#!/bin/bash
set -x
vm="PopOS VNC"
vmstate=$(virsh list --all | grep " $vm " | awk '{ print $3}')
if [ "$vmstate" == "x" ] || [ "$vmstate" != "running" ]
then
echo "VM is shut down"
else
echo "VM is running!"
fi
set +x我认为grep " $vm "中存在变量展开的问题。
请把你的结果张贴在帖子中。
此外,请记住,awk默认字段分隔符是。当您的$vm为2字时,所需的awk字段将右移到:awk '{ print $4}',如果$vm为3字,则所需的awk字段为awk '{ print $5}'。
也许用最后一个词awk '{ print $NF}'更好
或者在最后一个单词awk '{ print $(NF - 1)}'之前用一个词
https://stackoverflow.com/questions/71195373
复制相似问题