2016-04-30 157 views
1

我在下面的代碼中使用了getopts以及associate array。 我無法弄清楚如何正確調用我的值,因爲我要求(2)使用相同標誌的別名。bash - 在bash腳本中使用getopts和關聯數組

這是我到目前爲止有:

#!/bin/bash 

set -e 

usage() { 
    echo "Usage: $0 -c alias1 -c alias2" 
} 

while getopts ":c:" opt; do 
    case $opt in 
    c) alias="$OPTARG";; 
    *) echo "Error unknown option -$OPTARG" 
     usage 
     exit 1 
     ;; 
    esac 
done 

# Testing use off array 
declare -A alias=([alias1]=myhost-01.com \ 
        [alias2]=myhost-02.com \ 
        [alias3]=myhost-03.com \ 
        [alias4]=myhost-04.com) 

echo "This is my source host:${alias}" 
echo "This is my target host:${alias}" 

這是我想執行它(或更好suggeested方式):

-bash-4.1$ ./test-array2.sh -c alias1 -c alias4 
This is my source host: 
This is my target host: 

很顯然,我沒有得到我預期結果會是這樣的:

This is my source host: myhost-01.com 
This is my target host: myhost-04.com 

我該怎麼做?我想傳入(2)別名,它使用我的別名映射(關聯數組)來獲取正確的鍵值對,或者我的方法是錯誤的,我不能使用兩次-c?謝謝。

+0

IIRC,數組訪問是'$ {array [$ index]}'。所以我相信源將是'$ {alias [alias1]}'和目標$ {alias [alias4]}'。我通常會使用索引,即'alias1'的'0'insteead等,但這就是我。不過,我對Bash沒有太多的瞭解。 –

+0

所以在命令行中通過編號調用它? './test-array2.sh -c 0 -c3'? – noober

回答

1

您可以使用數組來存儲別名,例如

aliases=() 
while getopts ":c:" opt; do 
    case $opt in 
     c) aliases+=("$OPTARG");; 
    # ... 
    esac 
done 

然後你用這個數組索引你的關聯數組:

echo "This is my source host:${alias_to_host[${aliases[0]}]}" 
echo "This is my target host:${alias_to_host[${aliases[1]}]}" 

但如果輸入選項是代表源主機和目標主機別名和有總是恰好是兩個主機,它會是乾淨得多使用單獨的選項(例如-s-d)和這些獨立變量不是重用開關-c

# ... 
    case $opt in 
     s) source=$OPTARG;; 
     d) destination=$OPTARG;; 
     # ... 
    esac 
# ... 

echo "This is my source host:${alias_to_host[$source]}" 
echo "This is my target host:${alias_to_host[$destination]}" 
+0

我同意,使用2個開關會更清潔。但在我的'getopts'中,我可以用兩個不同的開關調用'aliases'嗎? – noober

+0

是的,你仍然可以使用相同的'alias_to_host'地圖。請注意,我將原始的'alias'關聯數組重命名爲'alias_to_host'以更具描述性。 – jil

+0

完美!很棒。謝謝 :-) – noober