在Bash中的文本文件中创建一个数组

脚本获取URL,解析所需字段,并将其输出重定向到保存在文件file.txt中。 每找到一个字段,输出就会保存在一个新行中。

file.txt的

A Cat
A Dog
A Mouse 
etc... 

我想采用file.txt并在一个新的脚本中创建一个数组,其中每一行都是它自己的数组中的字符串变量。 到目前为止,我尝试过:

#!/bin/bash

filename=file.txt
declare -a myArray
myArray=(`cat "$filename"`)

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

当我运行这个脚本时,空格会导致单词被分割而不是变成

期望的输出

Element [0]: A Cat 
Element [1]: A Dog 
etc... 

我最终得到这个:

实际产出

Element [0]: A 
Element [1]: Cat 
Element [2]: A
Element [3]: Dog 
etc... 

如何调整下面的循环,使每行上的整个字符串与数组中的每个变量一一对应?


使用mapfile命令:

mapfile -t myArray < file.txt

错误是for - 循环遍历文件行的惯用方式是:

while IFS= read -r line; do echo ">>$line<<"; done < file.txt

有关更多详细信息,请参阅BashFAQ / 005。


你也可以这样做:

oldIFS="$IFS"
IFS=$'n' arr=($(<file))
IFS="$oldIFS"
echo "${arr[1]}" # It will print `A Dog`.

注意:

文件名扩展仍然存在。 例如,如果有一行带有文字* ,它将展开到当前文件夹中的所有文件。 所以只有在你的文件没有这种情况时才使用它。


mapfilereadarray (是同义词)在Bash版本4和更高版本中可用。 如果你有一个旧版本的Bash,你可以使用循环将文件读入一个数组:

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

如果文件的最后一行不完整(缺失换行符),则可以使用以下替代方法:

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

有关:

  • 需要在旧系统上替代脚本的readarray / mapfile
  • 链接地址: http://www.djcxy.com/p/25573.html

    上一篇: Creating an array from a text file in Bash

    下一篇: A variable modified inside a while loop is not remembered