我试图将包含行文件读入Bash数组。
到目前为止,我尝试了以下几种方法:
Attempt1
a=( $( cat /path/to/filename ) )
Attempt2
index=0
while read line ; do
MYARRAY[$index]="$line"
index=$(($index+1))
done < /path/to/filename
这两种尝试都只返回一个包含文件第一行的元素数组。我做错了什么?
我运行bash 4.1.5
基于BinaryZebra评论的最新修订
在这里测试。命令eval的添加允许将表达式保存在当前的执行环境中,而之前的表达式仅在eval期间保存。
使用没有空格\制表符的$IFS,只有换行符/CR
$ IFS=$'\r\n' GLOBIGNORE='*' command eval 'XYZ=($(cat /etc/passwd))'
$ echo "${XYZ[5]}"
sync:x:5:0:sync:/sbin:/bin/sync
还要注意,你可能设置的数组很好,但是读错了——一定要像上面的例子一样使用双引号""和大括号{}
编辑:
请注意我在评论中关于可能的glob扩展的回答的许多警告,特别是gniourf-gniourf对我之前尝试解决问题的评论
考虑到所有这些警告,我仍然把这个答案留在这里(是的,bash 4已经出现很多年了,但我记得一些只有2/3年历史的mac将pre-4作为默认shell)
另注:
也可以按照drizzt的建议,替换一个分叉的亚壳+猫
$(</etc/passwd)
我有时使用的另一个选项是将IFS设置为XIFS,然后恢复。参见Sorpigal的回答,不需要为此费心