2015-04-23 70 views
0

我正在嘗試編寫一個腳本,用於發出命令(與廚師相關)並獲取客戶端列表。我已將文件重定向到一個文件中,現在我正在逐行讀取該文件。所有這些我都可以成功地做到,但是下一部分證明是非常複雜的。我會盡力解釋我想達到的目標。我想將這些從行中獲取的值分配給不同的變量。先來看看代碼:自動增量變量名稱

#!/bin/bash 
cd /home/usrname/chef-repo 
knife client list > /home/usrname/nodes.txt 
NOL=`cat /home/usrname/nodes.txt | wc -l`  
for((i=1;i<=$NOL;i++)) 
do 
    VAR$i=`awk 'NR=='$i'{print $1}' /home/usrname/nodes.txt` 
    echo `$VAR$i` 
done 

的O/P:

[email protected]:~/ShellScripts$ ./line.sh 
./line.sh: line 9: VAR1=RhelVM: command not found 
./line.sh: line 10: 1: command not found 

./line.sh: line 9: VAR2=TrialNode: command not found 
./line.sh: line 10: 2: command not found 

./line.sh: line 9: VAR3=TrialNode2: command not found 
./line.sh: line 10: 3: command not found 

./line.sh: line 9: VAR4=WIN-OG02P1DGC30: command not found 
./line.sh: line 10: 4: command not found 

./line.sh: line 9: VAR5=vmnt-validator: command not found 
./line.sh: line 10: 5: command not found 

我想這個腳本做的是分配這些節點名稱分別遞增變量名。

例如, VAR1將獲得分配值RhelVM 和echo $VAR1返回RhelVM

VAR2將獲得分配TrialNode和和echo $VAR2將返回TrailNode等。

正如你們可以看到的,我的方法會出錯。有沒有辦法做到這一點?

回答

0

您可以使用申報指令:

declare var$i=$(awk 'NR==$i{print $1; exit}' /home/usrname/nodes.txt) 
  • 最好使用小寫的變量名,以避免與shell的環境變量衝突。
  • 打印完後打電話給exit以使awk快速運行。

或者您可以使用sed,使之快:

declare var$i=$(sed $i'q;d' /home/usrname/nodes.txt) 
0

試試這個:

process.sh

#!/bin/sh 

i=1 
while read -u5 n; 
do 
    varname="VAR$i" 
    eval $varname=$n 
    i=$((i+1)) 
done 5< nodes.txt 

echo "VAR1 = $VAR1" 
echo "VAR3 = $VAR3" 

對於nodes.txt與內容

RhelVM 
TrialNode 
TrialNode2 
WIN-OG02P1DGC30 
vmnt-validato 

結果將是

[myhost]\> ./process.sh 
VAR1 = RhelVM 
VAR3 = TrialNode2 

一個更好的方法是用在這裏猛砸陣列(看到這一點:http://www.tldp.org/LDP/abs/html/arrays.html

0

使用數組。

cd /home/usrname/chef-repo 
while read -r line; do 
    VAR+=("$line") 
done < <(knife client list) 

如果你有bash 4或更高版本,可以使用readarray更換循環。

readarray -t VAR < <(knife client list) 

其他說明:

  • 使用NOL=$(wc -l < /home/usrname/nodes.txt)獲得行數。但你不需要這個變量。 :)

  • 使用while循環與read而不是一個for循環,開始一個新的awk過程只是爲了讀取每一行。

  • 使用進程替換<(knife client list)來避免需要臨時文件。