在单个循环中在两个数组之间迭代

Iterate between two arrays within a single loop

我有这些变量:

bridge_xa_name_list=( "$br_int0_srxa" "$br_int1_srxa" "$br_int2_srxa" "$br_int6_srxa" "$br_int7_srxa" "$br_wan3_srxa1" "$br_wan3_srxa2" )
bridge_xb_name_list=( "$br_int0_srxb" "$br_int1_srxb" "$br_int2_srxb" "$br_int6_srxb" "$br_int7_srxb" "$br_wan3_srxb1" "$br_wan3_srxb2" )

我正在尝试使用单个循环来迭代每个数组的所有元素。

目前我有一个正常运行的循环,但只能通过引用 $bridge_xa_name_list

   for a in "${bridge_xa_name_list[@]}"; do
        shell_echo_textval_green "Network Bridge Name Detected" "$a"

        sleep 1
        shell_echo_text "Verifying $a network State"
        virsh_net_list=$(virsh net-list | grep active | grep $a)    

        if [[ ! $virsh_net_list == *"active" ]]
        then
            shell_echo "[Inactive]"
        else
            shell_echo "[Active]"
            shell_echo_green "$a.xml found. Undefining anyway."
            virsh net-undefine $a
        fi
            
        shell_echo_text "File $a.xml is at $srxa_fld_path"
        if [[ -f ${srxa_fld_path}${a}.xml ]]
        then
            shell_echo "[Yes]"
        else
            shell_echo "[Not Found]"
            shell_echo_text "Attempting to copy $a.xml template to ~/config/$srxa_nm"
            cp $xml_file_path $srxa_fld_path${a}.xml
            shell_echo ["Copied"]

            #Check if Copy was sucessfull
                if [[ -f $srxa_fld_path${a}.xml ]]
                then    
                    :
                else
                    shell_echo_red "[Failed]"
                    shell_echo_red "There was an error when trying to copy ${a}.xml"
                    shell_echo_error_banner "Script Aborted! 1 error(s)"
                    exit 1              
                fi
done

$a 在我的脚本中迭代第一个数组中的所有元素。但是,我想将第二个数组包含在同一个循环中。

这些是索引数组,因此您可以遍历索引:

for (( i = 0; i < ${#bridge_xa_name_list[@]}; i++ )); do
  echo "${bridge_xa_name_list[i]}"
  echo "${bridge_xb_name_list[i]}"
done

$a in my script is iterating all the elements from the 1st array. However, I would like to include the second array as part of the same loop.

我想你的意思是你想为 bridge_xa_name_list 的每个元素执行一次循环体,并为 bridge_xb_name_list 的每个元素分别执行一次循环体,而不复制循环体.是的,至少有两种简单的方法可以做到这一点:

  1. 绝对最简单的方法是在循环头中指定附加元素:

    for a in "${bridge_xa_name_list[@]}" "${bridge_xb_name_list[@]}"; do
      # loop body ...
    

    这里您需要了解的是,for 循环语法与访问数组没有任何关系。此类命令的 in 列表指定要迭代的零个或多个单独值(shell“单词”),在您的原始代码的情况下,这些值是由涉及 [=50= 的参数扩展产生的]参数bridge_xa_name_list。但这只是shell在执行命令之前扩展每个命令(路径扩展、参数扩展、命令扩展、.)的一般过程的一个特例。你可以随心所欲地使用它。

  2. 围绕循环创建一个函数,为每个函数参数执行一次。然后为每个数组调用一次该函数:

    my_loop() {
      for a in "$@"; do
        # loop body
      done
    }
    
    # ...
    
    my_loop "${bridge_xa_name_list[@]}"
    my_loop "${bridge_xb_name_list[@]}"
    

    请注意,这仍然表现出与上一项中描述的相同 expand-then-execute 行为,这就是为什么您必须将每个数组的 扩展 传递给一个单词每个元素)。没有直接的方法将整个数组作为单个参数传递。

    另请注意,shell 支持一种特殊的快捷方式来遍历 $@ 的所有元素。对于这种特殊情况,您可以完全省略 in 列表:

    my_loop() {
      for a; do
        # loop body
      done
    }
    

当然,你也可以结合上面的方法,提供函数并用两个数组的元素调用一次:

my_loop "${bridge_xa_name_list[@]}" "${bridge_xb_name_list[@]}"