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

脚本获取一个URL,parsing它所需的字段,并将其输出redirect到保存在file.txt文件中。 每次find字段时,输出将保存在新行中。

file.txt的

A Cat A Dog A Mouse etc... 

我想采取file.txt并从一个新的脚本中创build一个数组,其中每一行成为自己的stringvariables在数组中。 到目前为止我已经尝试过:

 #!/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... 

我怎样才能调整下面的循环,使每行上的整个string将与数组中的每个variables一一对应?

使用mapfile命令:

 mapfile -t myArray < file.txt 

错误是使用for – 惯用的方式来循环一个文件的行是:

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

有关更多详细信息,请参阅Bash FAQ 。

你也可以这样做:

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

注意:

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

您可以简单地从文件中读取每行并将其分配给一个数组。

 #!/bin/bash i=0 while read line do arr[$i]="$line" i=$((i+1)) done < file.txt 

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

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

如果文件有一个不完整的(缺失换行符)最后一行,你可以使用这个select:

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

有关:

  • 需要在旧系统上替代readarray / mapfile脚本