繁体   English   中英

自动递增变量名

[英]Auto Incrementing Variable Names

我试图编写一个脚本,在该脚本中触发命令(与Chef相关)并获取客户端列表。 我已将其重定向到文件中,现在正在逐行读取该文件。 我可以成功完成所有这些操作,但是接下来的部分证明非常复杂。 我将尝试解释我想要实现的目标。 我想将这些从行获取的值分配给另一个变量。 首先看一下代码:

#!/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:

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

我希望此脚本要做的是分别将这些节点名称分配给递增的变量名称。

例如。 VAR1将被分配值RhelVM,而echo $VAR1将返回RhelVM

VAR2将被分配TrialNode,并echo $VAR2将返回TrailNode ,依此类推。

你们可以看到,我的方法出了错。 有什么办法吗?

您可以使用声明指令:

declare var$i=$(awk 'NR==$i{print $1; exit}' /home/usrname/nodes.txt)
  • 最好使用小写的变量名,以避免与shell env变量冲突。
  • 最好在打印后调用exit以使awk快速运行。

或者,您可以使用sed使其快速:

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

尝试这个:

进程.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

使用数组。

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)获取行数。 但是您不需要此变量。 :)

  • 使用带有readwhile循环,而不是for循环,它会开始一个新的awk进程,以仅读取每一行。

  • 使用进程替换<( knife client list )来避免需要一个临时文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM