使用嵌套for循环bash



我是第一次编写bash脚本。我必须使用nested for loop。我有一个这样的数组:

(foo,bar a,b)

数组中有两个元素,数组中的每个元素都用逗号分隔。我希望数组中的每个元素都拆分并打印每个元素。我想要的最终结果是

foo
bar
a
b

我使用嵌套的for循环如下,但我没有得到任何响应

IFS=','
echo "class names is::${classNames[@]}" // prints foo,bar a,b
for ((n=0;n<${#classNames[@]};n++)){

classes=${classNames[n]}

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

echo "${eachClass[i]}"

}
}

您可以:

arr=(foo,bar a,b)
for i in "${arr[@]}"; do
while IFS=, read -ra arr_in; do
for j in "${arr_in[@]}"; do
echo "$j"
done
done <<<"$i"
done

或类似:

for i in "${arr[@]}"; do
readarray -d, -t arr_in < <(printf "%s" "$i")
for j in "${arr_in[@]}"; do
echo "$j"
done
done

或者只是:

while IFS=, read -ra arr_in; do
for j in "${arr_in[@]}"; do
echo "$j"
done
done < <(printf "%sn" "${arr[@]}"

甚至:

while IFS=, read -ra arr_in; do
printf "%sn" "${arr_in[@]}"
done < <(printf "%sn" "${arr[@]}"

但也就是说:

printf "%sn" "${arr[@]}" | tr ',' 'n'

也将打印相同的。

不要使用{}作为循环终止符——它是未记录的非常古老的bash/shell语法。使用do..done

classes=...是一个普通变量,而不是一个数组,在这种赋值中,IFS无关紧要——这里=的右侧部分不进行分词。要分配数组,请使用大括号classes=(${classNames[n]})

您可以使用IFS:将值拆分为空格和逗号

IFS=', ' read -ra arr <<<"${arr[*]}"
for i in "${arr[@]}"; do
echo "$i"
done

甚至类似:

while IFS= read -r i; do
echo "$i"
done < <(IFS=', '; printf "%sn" ${arr[*]})

。。。或者像这个

for item in "${arr[@]}"; {
sub=(${item//,/ })
echo "item1=${sub[0]}"
echo "item2=${sub[1]}"
}

read

for item in "${arr[@]}"; {
read i1 i2 <<< ${item//,/ }
echo "item1=$i1"
echo "item2=$i2"
}

诀窍是,我们通过这个bash语法${item//,/ }(${var_name//pattern/replacement})将","切换为"(空格),这被称为变量替换。这一个<<<用于直接从变量中读取

是一种不使用明显循环的实用单行解决方案

(IFS=', '; printf '%sn' ${classNames[*]})

它在子shell中运行,以避免与当前shell的IFS发生冲突。

相关内容

  • 没有找到相关文章

最新更新