Bash数组没有填充从文件中读取的循环

时间:2017-06-08 19:05:19

标签: arrays bash

我试图用bash中的文件中的行填充数组。我不明白这里发生了什么:

balter@exahead1:~$ declare -a a
balter@exahead1:~$ cat t.txt
a b
c d
e f
g h
balter@exahead1:~$ cat t.txt | while read -r line; do echo $line; a=("${a[@]}" "$line"); echo "$i: ${a[$i]}"; echo "${a[@]}"; ((i++)); done
a b
0: a b
a b
c d
1: c d
a b c d
e f
2: e f
a b c d e f
g h
3: g h
a b c d e f g h
balter@exahead1:~$ echo "${a[@]}"

balter@exahead1:~$

修改 显然它"工作"如果我重定向文件而不是管道它:

balter@exahead1:~$ while read -r line; do echo $line; a=("${a[@]}" "$line"); echo "$i: ${a[$i]}"; echo "${a[@]}"; ((i++)); done < t.txt
a b
0: a b
a b
c d
1: c d
a b c d
e f
2: e f
a b c d e f
g h
3: g h
a b c d e f g h
balter@exahead1:~$ echo "${a[@]}"
a b c d e f g h
balter@exahead1:~$

编辑2 @ anubhava - 我需要什么版本的bash?我尝试了你的建议,虽然我们有mapfile但它没有&#34;工作&#34;。

balter@exahead1:~$ bash --version
bash --version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)   
balter@exahead1:~$ unset a
balter@exahead1:~$ a=()
balter@exahead1:~$ mapfile -t a < t.txt
balter@exahead1:~$ echo "${a[@]}"

balter@exahead1:~$

第二种方法都没有:

balter@exahead1:~$ unset a
balter@exahead1:~$ a=()
balter@exahead1:~$ echo "${a[@]}"

balter@exahead1:~$
balter@exahead1:~$ while IFS= read -r line; do a+=("$line"); done < t.txt
balter@exahead1:~$ echo "${a[@]}"

balter@exahead1:~$

编辑3

以上两种方法&#34;工作&#34;在我的Mac上运行 El Capitan

1 个答案:

答案 0 :(得分:1)

您可以使用内置mapfile

mapfile -t arr < file

如果您使用的是较旧的BASH版本,则可以使用while循环:

arr=()

while IFS= read -r line; do
   arr+=("$line")
done < file