2013-01-12 46 views
1

在bash腳本中,如何從另一個變量的內容獲取變量的內容,兩個變量的名稱都有相同的尾部數?獲取變量的內容,從另一個變量的內容中,兩個變量名的尾部編號相同

IP1=192.168.0.17 
DIR1=/mnt/2tb/archive/src/ 
IP2=192.168.0.11 
DIR2=~/src/ 
IP3=192.168.0.113 
DIR3=~/src/ 

#get local ip and set variable HOST to local ip 
HOST=$(ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}') 

# get HOST source DIR as variable from ip and preset variables 

echo $HOSTDIR 

回答

0

如果只有3,使用IF語句

if [ $HOST = $IP1 ]; then 
    HOSTDIR=$DIR1 
elif [ $HOST = $IP2 ]; then 
    HOSTDIR=$DIR2 
... 

另一種方法是使用間接擴展:

for num in 1 2 3 4 5 6 7 8 9 10 
do 
    ip=IP$num 
    MYIP=${!ip} 
    if [ $HOST = $MYIP ]; then 
     dir=DIR$num 
     HOSTDIR=${!dir} 
     break 
    fi 
done 
+0

我希望能夠在未來添加更多,或者對於每臺機器(ip)都有不同的dirs,我希望它是相對於該尾號:) – dreadycarpenter

+0

使用間接擴展。用一個例子編輯了答案。 – sureshvv

0

你可以用一個關聯數組做到這一點。

下面是它們是如何使用的例子:

#! /bin/bash 

typeset -A dirs   # -A for associative array, -a for indexed arrays 

dirs["192.168.0.17"]=foo # build your map of ip -> dirs 
dirs["192.168.0.18"]=bar 

ip=192.168.0.17 
echo ${dirs[$ip]}   # print the value associated with $ip 
ip=192.168.0.18 
echo ${dirs[$ip]} 
1

您可以使用eval象下面這樣:

HOSTDIR=$(for i in {1..3}; do eval if [[ \$IP$i == "$HOST" ]] \; then echo \$DIR$i \; fi; done) 

但在使用關聯數組作爲另一種解決方案是提出一個更好的主意。

+0

謝謝,這正是我尋找的那一行:D – dreadycarpenter