我试图用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 。
答案 0 :(得分:1)
您可以使用内置mapfile
:
mapfile -t arr < file
如果您使用的是较旧的BASH版本,则可以使用while
循环:
arr=()
while IFS= read -r line; do
arr+=("$line")
done < file