自动递增变量名称



我正在尝试编写一个脚本,在其中触发命令(与 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 将被分配值 RhelVMecho $VAR1会返回RhelVM

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

正如你们所看到的,我的方法大错特错。有什么办法可以做到这一点吗?

您可以使用 declare 指令:

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)

试试这个:

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"

对于节点.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 循环,而不是启动新awk进程只是为了读取每一行的 for 循环。

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

相关内容

  • 没有找到相关文章

最新更新