2015-03-25 54 views
-1

我有一個使用'eval'命令的bash腳本。 我不知道這是否是一個好主意,但我需要這樣做:Bash eval和動態調用變量

i=1 
for e in $items; do 
    echo $i - $e 
    eval vm_$i=$e 
    let i++ 
done 

然後我像這樣顯示菜單:

while [ "$c" != "q" ]; do 
    read c 
    case $c in 
      1) 
      echo "CB Node $vm_1" 
      ssh "$vm_1" "couchbase-cli server-info -c $cluster" 
      ;; 
      2) 
      ;; 
      3) 
      ;; 
      l) echo "Listing cluster nodes... " 

      ;; 
      q) exit 2 
    esac 

它的工作原理,但現在我想在我的'case'中使用變量$ c來生成好的變量$ vm1($ vm_ $ c,$ c對應於$ i其實..)。 我嘗試了一些東西,例如:echo「CB Node $(eval $ vm $ c)」,但它不起作用。

+0

你可以使用數組嗎? '節點[I] = $È; echo $ {node [i]}' – choroba 2015-03-25 10:14:37

回答

0

如果您改爲使用數組,那麼這將會更加優雅和安全。

vm=(dummy $items) 
vm[0]='' # get rid of dummy zero index 

while true; do 
    read -p 'Quick, do something! ' c 
    case $c in 
     [1-${#vm[@]}]) 
     echo "CB Node ${vm[$c]}" 
     ssh "${vm[$c]}" "couchbase-cli server-info -c $cluster" ;; 
     l) 
     : ;; 
     q) exit 2;; 
     *) echo 'Try again.';; 
    esac 
done 

數組和間接引用${!var}是僅Bash構造。

+0

謝謝。什麼確切'設置 - $項目'?我不明白間接引用... – Isador 2015-03-25 10:41:04

+0

'set'將項目複製到'$ 1','$ 2','$ 3'等,以便於參考。根據'$ items'中的內容,您可以使用'read -a'來直接讀取數組中的項目而不需要循環;但隨後會生成一個基於零的數組。 – tripleee 2015-03-25 10:42:22

+0

實際上,更新答案使用直接分配,而不是通過'set'去。 – tripleee 2015-03-25 10:53:57