Arrays 在Bash中从文本文件创建数组
脚本获取URL,将其解析为所需字段,并重定向其输出以保存在文件file.txt中。每次找到字段时,输出都保存在新行上 file.txt 我想获取Arrays 在Bash中从文本文件创建数组,arrays,bash,loops,scripting,variable-assignment,Arrays,Bash,Loops,Scripting,Variable Assignment,脚本获取URL,将其解析为所需字段,并重定向其输出以保存在文件file.txt中。每次找到字段时,输出都保存在新行上 file.txt 我想获取file.txt并在一个新脚本中从中创建一个数组,其中每一行都是数组中自己的字符串变量。到目前为止,我已经尝试: #!/bin/bash filename=file.txt declare -a myArray myArray=(`cat "$filename"`) for (( i = 0 ; i < 9 ; i++)) do echo
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
我最终得到了这个:
实际产量
如何调整下面的循环,使每行上的整个字符串与数组中的每个变量一一对应 使用命令:
有关更多详细信息,请参阅。您也可以这样做:
oldIFS="$IFS"
IFS=$'\n' arr=($(<file))
IFS="$oldIFS"
echo "${arr[1]}" # It will print `A Dog`.
oldIFS=“$IFS”
IFS=$'\n'arr=($(您只需从文件中读取每一行并将其分配给数组即可
#!/bin/bash
i=0
while read line
do
arr[$i]="$line"
i=$((i+1))
done < file.txt
!/bin/bash
i=0
读行时
做
arr[$i]=“$line”
i=$((i+1))
完成
mapfile
和readarray
(同义)在Bash版本4和更高版本中可用。如果您有较旧版本的Bash,可以使用循环将文件读入数组:
arr=()
while IFS= read -r line; do
arr+=("$line")
done < file
arr=()
当IFS=读取-r行时;执行
arr+=(“$line”)
完成<文件
如果文件的最后一行不完整(缺少换行符),您可以使用以下替代方法:
arr=()
while IFS= read -r line || [[ "$line" ]]; do
arr+=("$line")
done < file
arr=()
当IFS=read-r行| |[“$line”]];do
arr+=(“$line”)
完成<文件
相关的:
使用映射文件或读取-a
始终使用检查代码。它通常会给出正确的答案。在本例中,包括将具有空格分隔值或换行分隔值的文件读入数组
#!/bin/bash
i=0
while read line
do
arr[$i]="$line"
i=$((i+1))
done < file.txt
不要这样做
具有以换行符分隔的值的文件
mapfile-t数组<表示要使用
mapfile -t myArray < file.txt
mapfile-t myArray
如果出于任何原因希望在bash<4.x上使用mapfile
,我为mapfile
创建了一个for。如果在bash>=4.x上,它将使用现有的mapfile
命令
目前,只有选项-d
和-t
起作用。但对于上面的命令来说,这应该足够了。我只在macOS上进行了测试。在macOS Sierra 10.12.6上,系统bash是3.2.57(1)-发行版
。因此垫片可以派上用场。你也可以用自制软件更新bash,自己构建bash,等等
它用于设置变量以建立一个调用堆栈。这就是全部内容。也是中的数组主题。我会将此链接为的副本,但接受的答案非常糟糕。Etan,非常感谢您如此快速准确的回答!我曾尝试在论坛中搜索我的问题,但没有想到查找stackoverflow的常见问题解答。mapfile命令正好满足了我的需要!再次感谢:)回答。(设置反向链接,因为我们这里有比那里更好的可接受答案)。有没有办法只临时设置IFS
(以便在执行此命令后恢复其原始值),但仍将赋值持久化到arr
?请注意,文件名仍会扩展;例如IFS=$'\n'arr=($(echo'a 1';echo'*';echo'b 2');printf“%s\n”“${arr[@}”
@Hugues:yap,文件名仍在扩展。我将添加这一部分信息..thnks..抱歉,我不同意。IFS=…命令在当前shell中不会更改IFS
。但是,IFS=…其他变量=…
(无任何命令)在当前shell中同时更改IFS
和其他变量
。谢谢!这是有效的;不幸的是,没有更简单的方法,因为我喜欢arr=
符号(与mapfile
/readarray
相比)。由于这是作为标准问答进行推广,您还可以包括链接中提到的内容:而IFS=read-r;do line+=(“$REPLY”);在4.xBash 4之前的版本中不存在done mapfile。现在,bash 4已经有5年的历史了。升级。尽管bash 4在2009年发布,@ericslaw的评论仍然相关,因为许多机器仍然附带bash 3.x(并且不会升级,只要bash是在GPLv3下发布的)。如果您对可移植性感兴趣,需要注意的一点很重要。问题不是开发人员无法安装升级版本,而是开发人员应该意识到,如果没有其他步骤,使用mapfile
的脚本将无法在许多机器上按预期运行。@ericslaw Mac将继续与bash 3.2.57一起为fo提供可重新分配的未来。较新版本使用的许可证要求苹果共享或允许他们不想共享或允许的内容。如何访问阵列?我发现我必须在IFS=read-r line | |[[“$line”]]周围加上括号
让它工作。否则,它工作得很好!@TatianaRacheva:是不是在do
之前缺少分号?
#!/bin/bash
i=0
while read line
do
arr[$i]="$line"
i=$((i+1))
done < file.txt
arr=()
while IFS= read -r line; do
arr+=("$line")
done < file
arr=()
while IFS= read -r line || [[ "$line" ]]; do
arr+=("$line")
done < file
array=( $(mycommand) )
mapfile -t array < <(mycommand)
IFS=" " read -r -a array <<< "$(mycommand)"
mapfile -t myArray < file.txt