我正在尝试编写一个脚本,我在其中触发命令(与Chef相关)并获取客户列表。我已将其重定向到一个文件中,现在我正在逐行读取该文件。所有这些我都可以成功地做到,但是下一部分被证明是相当复杂的。我将尝试解释我想要实现的目标。我想将从行中获取的这些值分配给另一个变量。首先来看看代码:
blueUsers
O / P:
#!/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
我希望此脚本执行的操作是将这些节点名称分别指定为递增变量名称。
EG。 VAR1将被赋值为RhelVM
usrname@ubuntu:~/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
将返回echo $VAR1
,
VAR2将被分配TrialNode,而RhelVM
将返回echo $VAR2
,依此类推。
正如大家们所看到的,我的做法非常糟糕。有没有办法做到这一点?
答案 0 :(得分:0)
您可以使用declare directive:
declare var$i=$(awk 'NR==$i{print $1; exit}' /home/usrname/nodes.txt)
exit
以使awk快速运行。或者,您可以使用sed
来加快速度:
declare var$i=$(sed $i'q;d' /home/usrname/nodes.txt)
答案 1 :(得分: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)
答案 2 :(得分: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 )
来避免需要临时文件。