Bash数组本身

时间:2017-07-14 16:15:35

标签: arrays bash

我正在尝试编写一个接收.txt文件的代码,将每行文本排序到一个数组中,然后每当出现垂直条分隔符(|)时,根据每个行条目创建另一个数组。 我编写的代码大部分都有效,但我对输出有一些问题。

#!/bin/bash
mapfile -t myArray < placeholder.txt
for (( i = 0 ; i < ${#myArray[@]} ; i++))
do
        #echo "Element [$i]: ${myArray[$i]}"
        declare -a column
        for (( i = 0 ; i < ${#myArray[@]} ; i++))
        do
                 column+=( $(echo $myArray | tr "|" " ") )
        done

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

如果输入数据是:

example|of|data|in|array
more|array|data

我希望输出看起来像这样:

Element [0]: example
Element [1]: of
Element [2]: data
Element [3]: in
Element [4]: array
Element [5]: more
Element [6]: array
Element [7]: data

但相反,我得到了:

Element [0]: example
Element [1]: of
Element [2]: data
Element [3]: in
Element [4]: array
Element [5]: example
Element [6]: of
Element [7]: data
Element [8]: in
Element [9]: array

我几乎肯定这是我的循环问题,但如果我以错误的方式解决这个问题,请告诉我!

1 个答案:

答案 0 :(得分:0)

两个问题:

首先,不需要嵌套循环。您只需要遍历myArray一次。

其次,你没有回显myArray的当前元素,你总是回显第一个元素,因为你遗漏了数组索引。

您可以使用for var in而不是使用数组索引。而不是管道到tr,而是将IFS设置为管道分隔符。

mapfile -t myArray < placeholder.txt
declare -a column
for line in "${myArray[@]}"
do
    IFS='|'
    column+=( $line )
done

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