2014-11-08 41 views
0
#!/bin/bash 
VM=`su joe -c "VBoxManage list vms | awk '{split($0,a,"\""); print a[2]; exit}'"` 
echo $VM 

我喜欢从joe的角度来获取第一个VM名称。如何正确逃脱?在su和awk中逃脱

VBoxmanage列表虚拟机的输出是:

"VM 1" {serial num} 
"VM 2" {serial num} 

回声应该输出中VM 1.

+0

什么是'VBoxManage列表输出vms'命令是什么,从这个命令的预期输出? – anubhava 2014-11-08 11:00:36

+0

输出结果为:“VM 1”{b3267302-6b59-40a5-acb6-27e7f9676b91} \ n“VM 2”{...我喜欢获取第一个VM名称(VM 1)。 – 2014-11-08 11:06:02

+0

您应该编辑您的问题以包含该文本。 – 2014-11-08 11:08:52

回答

0
VM=$(su joe -c 'VBoxManage list vms | cut -d \" -f2 | sed 1q') 
0

有几种方式圆这一点。这里有一个:

VM=$(su joe -c "VBoxManage list vms | awk -F'\"' '{print \$2; exit}'") 

而不是使用拆分,只是改变字段分隔符。根据输出的行数,也可能不需要退出调用。如果只有一行,awk将在处理完毕后退出。我还将整个命令的反引号改为首选的$()语法。

+0

好主意,但是:bash:-c:第0行:寻找匹配时的意外EOF bash:-c:第1行:语法错误:文件意外结束 – 2014-11-08 11:10:38

+0

正如我上面所说,看到你的命令输出的问题,但是,你是对的,这需要修复。 – 2014-11-08 11:14:38

+1

已更新输出格式。 – 2014-11-08 11:19:27

0

你需要逃避"$两个:

VM=$(su joe -c "VBoxManage list vms | awk -F '\"' '{print \$2; exit}'") 
echo "$VM" 
VM 1