在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
mapfile
和readarray
(是同义词)在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脚本