如何在Bash循环中按行分组输出数组$LIST,而非逐个元素打印?
解决bash数组按组换行输出的问题
你的问题核心是当前数组LIST将每个独立字符串作为单独元素,循环时会逐个输出。要实现每3个元素为一行的分组输出,有以下几种可行方案:
方案1:C风格for循环按索引步长遍历
利用数组索引,每次步进3,取出对应位置的3个元素拼接输出:
LIST=( \ "1" "Some text" "ON" \ "2" "Some text" "OFF" \ "3" "Some text. Some text" "ON" \ "4" "Some text" "OFF" \ "5" "Some text. Some text" "OFF" \ ) for ((i=0; i<${#LIST[@]}; i+=3)); do echo "${LIST[i]} ${LIST[i+1]} ${LIST[i+2]}" done
方案2:while循环结合shift处理
将数组转为位置参数,每次取出前3个元素后移除,直到参数耗尽:
LIST=( \ "1" "Some text" "ON" \ "2" "Some text" "OFF" \ "3" "Some text. Some text" "ON" \ "4" "Some text" "OFF" \ "5" "Some text. Some text" "OFF" \ ) set -- "${LIST[@]}" while (( $# >= 3 )); do echo "$1 $2 $3" shift 3 done
方案3:重新构造数组(最直观)
如果可以提前调整数组结构,将每组元素用引号包裹作为单个数组元素,直接循环输出即可:
LIST=( \ "1 Some text ON" \ "2 Some text OFF" \ "3 Some text. Some text ON" \ "4 Some text OFF" \ "5 Some text. Some text OFF" \ ) for ENTRY in "${LIST[@]}"; do echo "$ENTRY" done
以上三种方案都能得到你期望的输出结果,可根据实际场景选择:
- 方案1适合固定每组元素数量的场景,代码简洁直接;
- 方案2更灵活,能处理元素总数不是3的倍数的情况;
- 方案3最易理解,适合可以提前调整数组构造逻辑的场景。
内容的提问来源于stack exchange,提问作者Paweł Selen
相关产品推荐
相关产品推荐

