2014-11-08 78 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