在Bash中从文本文件创建数组

在Bash中从文本文件创建数组

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

file.txt的

A CatA DogA Mouse etc...

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

#!/bin/bashfilename=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]: AElement [3]: Dog etc...

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


眼眸繁星
浏览 675回答 3
3回答

慕婉清6462132

使用mapfile命令:mapfile&nbsp;-t&nbsp;myArray&nbsp;<&nbsp;file.txt错误正在使用for- 循环文件行的惯用方法是:while&nbsp;IFS=&nbsp;read&nbsp;-r&nbsp;line;&nbsp;do&nbsp;echo&nbsp;">>$line<<";&nbsp;done&nbsp;<&nbsp;file.txt有关详细信息,请参阅BashFAQ / 005。

鸿蒙传说

mapfile和readarray(它们是同义词)在Bash版本4及更高版本中可用。如果您有旧版本的Bash,则可以使用循环将文件读入数组:arr=()while&nbsp;IFS=&nbsp;read&nbsp;-r&nbsp;line;&nbsp;do &nbsp;&nbsp;arr+=("$line")done&nbsp;<&nbsp;file如果文件的最后一行有不完整(缺少换行符),您可以使用此替代方法:arr=()while&nbsp;IFS=&nbsp;read&nbsp;-r&nbsp;line&nbsp;||&nbsp;[[&nbsp;"$line"&nbsp;]]&nbsp;&nbsp;do &nbsp;&nbsp;arr+=("$line")done&nbsp;<&nbsp;file有关:在旧系统上需要替换readarray / mapfile作为脚本

慕仙森

你也可以这样做:oldIFS="$IFS"IFS=$'\n'&nbsp;arr=($(<file))IFS="$oldIFS"echo&nbsp;"${arr[1]}"&nbsp;#&nbsp;It&nbsp;will&nbsp;print&nbsp;`A&nbsp;Dog`.注意:文件名扩展仍然存在。例如,如果有一行文字*,它将扩展到当前文件夹中的所有文件。因此,只有当您的文件没有这种情况时才使用它。
打开App,查看更多内容
随时随地看视频慕课网APP