在单个循环中在两个数组之间迭代
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
的每个元素分别执行一次循环体,而不复制循环体.是的,至少有两种简单的方法可以做到这一点:
绝对最简单的方法是在循环头中指定附加元素:
for a in "${bridge_xa_name_list[@]}" "${bridge_xb_name_list[@]}"; do
# loop body ...
这里您需要了解的是,for
循环语法与访问数组没有任何关系。此类命令的 in
列表指定要迭代的零个或多个单独值(shell“单词”),在您的原始代码的情况下,这些值是由涉及 [=50= 的参数扩展产生的]参数bridge_xa_name_list
。但这只是shell在执行命令之前扩展每个命令(路径扩展、参数扩展、命令扩展、等.)的一般过程的一个特例。你可以随心所欲地使用它。
或
围绕循环创建一个函数,为每个函数参数执行一次。然后为每个数组调用一次该函数:
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[@]}"
我有这些变量:
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
的每个元素分别执行一次循环体,而不复制循环体.是的,至少有两种简单的方法可以做到这一点:
绝对最简单的方法是在循环头中指定附加元素:
for a in "${bridge_xa_name_list[@]}" "${bridge_xb_name_list[@]}"; do # loop body ...
这里您需要了解的是,
for
循环语法与访问数组没有任何关系。此类命令的in
列表指定要迭代的零个或多个单独值(shell“单词”),在您的原始代码的情况下,这些值是由涉及 [=50= 的参数扩展产生的]参数bridge_xa_name_list
。但这只是shell在执行命令之前扩展每个命令(路径扩展、参数扩展、命令扩展、等.)的一般过程的一个特例。你可以随心所欲地使用它。或
围绕循环创建一个函数,为每个函数参数执行一次。然后为每个数组调用一次该函数:
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[@]}"