2015-04-23 4 views
0

Я пытаюсь написать сценарий, в котором я запускаю команду (связанную с шеф-поваром) и получаю список клиентов. Я перенаправил это в файл и теперь читаю из этого файла по строкам. Все это я мог бы успешно сделать, однако следующая часть оказалась довольно сложной. Я попытаюсь объяснить, чего я хочу достичь. Я хочу присвоить эти значения, полученные из строки, в другую переменную. Во-первых, посмотрите на код:Auto Incrementing Variable Names

#!/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) 
  • Лучше использовать строчное имя переменного, чтобы избежать столкновений с оболочкой ENV переменными.
  • Лучше позвонить 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 

Лучше было бы использовать Bash массивы здесь (см это: 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 вместо для цикла, который начинается новый awk процесс только для чтения каждой строки.

  • Использовать замену процесса <(knife client list), чтобы избежать временного файла.