2015-11-24 177 views
1

我似乎不能在shell腳本中分配一堆變量。我試圖將HOST1,HOST2,HOST3分配給三個不同的機器名稱。使用for循環設置變量

我的腳本如下:

#!/bin/bash 
    # 
    set -vx 

    FIXHOSTS=`cat /tmp/fixHosts.txt` 
    NUMBER=1 
    NUMBEROFHOSTS=`cat /tmp/fixHosts.txt | wc -l` 

    for line in $FIXHOSTS 
    do 
    HOST$NUMBER=$line 
    echo $HOST1 
    ((NUMBER = $NUMBER + 1)) 
    done 

    echo $HOST1 
    echo $HOST2 
    echo $HOST3 
    echo $HOST4 

fixHosts.txt包含以下內容:

 wayne-000 
     wayne-002 
     wayne-003 

這是輸出我得到:

for line in $FIXHOSTS 
do 
HOST$NUMBER=$line 
echo $HOST1 
((NUMBER = $NUMBER + 1)) 
done 
+ for line in '$FIXHOSTS' 
+ HOST1=wayne-000 
fvwmtest.sh: line 15: HOST1=wayne-000: command not found 
+ echo 

+ ((NUMBER = 1 + 1)) 
+ for line in '$FIXHOSTS' 
+ HOST2=wayne-002 
fvwmtest.sh: line 15: HOST2=wayne-002: command not found 
+ echo 

+ ((NUMBER = 2 + 1)) 
+ for line in '$FIXHOSTS' 
+ HOST3=wayne-003 
fvwmtest.sh: line 15: HOST3=wayne-003: command not found 
+ echo 

+ ((NUMBER = 3 + 1)) 

#done 

echo $HOST1 
+ echo 

echo $HOST2 
+ echo 

echo $HOST3 
+ echo 

echo $HOST4 
+ echo 

他們爲什麼不回聲?爲什麼他們沒有被分配?

+1

bash不支持動態變量,這是一個數組的作業。 @fedorqui這與OP通過全名解決變量無關。 – 123

+0

你*可以*用'printf -v'和'declare'做這個,但是不要。只需使用一個數組。另外[不要用'for'讀取行](http://mywiki.wooledge.org/DontReadLinesWithFor),如果你最初將文件讀入數組,你不會有任何這些問題或需要做任何事情那首先。關於如何逐行讀取文件和[Bash FAQ 005](http://mywiki.wooledge.org/BashFAQ),請參見[Bash FAQ 001](http://mywiki.wooledge.org/BashFAQ/001)/005#Loading_lines_from_a_file_or_stream)如何將文件讀入數組。 –

回答

0

動態變量在bash中會很煩人。該declare命令可以幫助:

$ num=13 
$ val="hello world" 
$ declare "host$num=$val" 
$ echo $host13 
hello world 

所以,你想:

num=0 
while read -r line; do 
    ((num++)) 
    declare host$num="$line" 
done < /tmp/fixHosts.txt 
num_hosts=$num 

echo $host1 $host2 $host3 ... 

注:

即使小號執行者是使用一個數組:如果你有bash版本4

mapfile -t hosts < /tmp/fixHosts.txt 
num_hosts=${#hosts[@]} 
echo ${hosts[0]} ${hosts[1]} ${hosts[2]} ...