循环遍历两个seq声明

时间:2018-04-06 10:09:58

标签: bash

我尝试使用bash脚本创建F5命令,该脚本循环执行两个序列声明,一个用于IP地址,另一个用于VLAN,然后我在最后连接。

#!/bin/bash

vlan_seq=$(seq 1010 1010;seq 1012 1024;seq 1054 1054;seq 1146 1161)
ip_seq=$(seq 10 10;seq 12 24;seq 54 54;seq 146 161)

for i in $ip_seq; do

ip_part=$(echo net self 10.189.${i}.1 "{" address 10.189.${i}.1/24)

done

for e in $vlan_seq; do

vlan_part=$(echo floating enabled traffic-group traffic-group-1 unit 1 vlan 
vlan_${e}_int_compute "}")

done

echo ${ip_part} ${vlan_part}

这似乎有效,但我只是得到了最后的结果,而且我对如何解决这个问题感到有些困惑。我应该循环以获得所有结果?

net self 10.189.161.1 {address 10.189.161.1/24 floating enabled traffic-group traffic-group-1 unit 1 vlan vlan_1161_int_compute}

2 个答案:

答案 0 :(得分:1)

你真的需要两个序列吗?看起来vlan_seq中的条目比ip_seq中的相应条目多1000个。

因此我们可以为每个$i计算它:

#!/bin/bash

format=$(printf '%s\\n' \
         'self 10.189.%d.1 { address 10.189.%d.1/24' \
         '                   floating enabled' \
         '                   traffic-group traffic-group-1' \
         '                   unit 1' \
         '                   vlan vlan_%d_int_compute' \
         '}')


ip_seq=(10 {12..24} 54 {164..161})

for i in ${ip_seq[@]}; do
    printf "$format" $i $i $((1000+i))
done

答案 1 :(得分:0)

管理以找到更好的方法:

#!/bin/bash

vlan_seq=($(seq 1010 1010;seq 1012 1024;seq 1054 1054;seq 1146 1161))
ip_seq=($(seq 10 10;seq 12 24;seq 54 54;seq 146 161))

for ((i=0;i<${#ip_seq[@]};++i)); do

  printf "net self 10.189.%s.1 { address 10.189.%s.1/24 floating enabled traffic-group traffic-group-1 unit 1 vlan vlan_%s_int_compute }\n" 
"${ip_seq[i]}" "${ip_seq[i]}" "${vlan_seq[i]}"

done