在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`.
注意:
文件名扩展仍然存在。 例如,如果有一行带有文字*
,它将展开到当前文件夹中的所有文件。 所以只有在你的文件没有这种情况时才使用它。
mapfile
和readarray
(是同义词)在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
有关:
上一篇: Creating an array from a text file in Bash
下一篇: A variable modified inside a while loop is not remembered