bash - 使用嵌套的 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 "%s\n" "${arr[@]}"
甚至:
while IFS=, read -ra arr_in; do
printf "%s\n" "${arr_in[@]}"
done < <(printf "%s\n" "${arr[@]}"
但那说:
printf "%s\n" "${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 "%s\n" ${arr[*]})
推荐阅读
- python - AttributeError:“DatetimeIndexResampler”对象没有“滚动”属性
- javascript - setState 一个对象数组,根据 id 更新对象中的两个值
- react-native - 从 react-native 应用打包并执行 jar 文件
- ios - 使用 RxSwift 从后台进入前台时 AVPlayer 自动播放
- python - if-else python程序示例
- ios - 如何使用 NSUserDefaults 检查当前时间和上次发布时间?
- c# - 使用 concat() 从连接表中选择连接列,例如 '%%'
- python - 使用指定步骤从较小的 DataFrame 中获取值
- asp.net - 回调 URL 忽略 & 之后的参数值
- javascript - 使用 rert-native-fs 在 React-Native 中保存文件