我试图将包含行的文件读入Bash数组.
到目前为止,我已尝试过以下内容:
a=( $( cat /path/to/filename ) )
Run Code Online (Sandbox Code Playgroud)
index=0
while read line ; do
MYARRAY[$index]="$line"
index=$(($index+1))
done < /path/to/filename
Run Code Online (Sandbox Code Playgroud)
两次尝试仅返回包含文件第一行的一个元素数组.我究竟做错了什么?
我正在运行bash 4.1.5
che*_*ner 231
该readarray命令(也拼写mapfile)是在bash 4推出,我相信.
readarray -t a < /path/to/filename
Run Code Online (Sandbox Code Playgroud)
nhe*_*hed 119
最新修订基于BinaryZebra评论的评论
并在此进行测试.添加command 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
Run Code Online (Sandbox Code Playgroud)
另请注意,您可能正在设置数组,但读错了 - 请务必同时使用双引号""和括号,{}如上例所示
编辑:
请注意关于我可能的全球扩展的评论中有关我的答案的许多警告,特别是gniourf-gniourf关于我之前尝试解决的问题的评论
考虑到所有这些警告,我仍然在这里留下这个答案(是的,bash 4已经出了很多年了,但我记得有些mac只有2/3岁才有4级作为默认shell)
其他说明:
也可以按照下面的drizzt的建议,用一个分叉的子壳+猫替换
$(</etc/passwd)
Run Code Online (Sandbox Code Playgroud)
我有时使用的另一个选项是将IFS设置为XIFS,然后恢复.另见Sorpigal的答案,不需要为此烦恼
Sor*_*gal 102
将文件的每一行读入bash数组的最简单方法是:
IFS=$'\n' read -d '' -r -a lines < /etc/passwd
Run Code Online (Sandbox Code Playgroud)
现在只需索引到数组中lines以检索每一行,例如
printf "line 1: %s\n" "${lines[0]}"
printf "line 5: %s\n" "${lines[4]}"
# all lines
echo "${lines[@]}"
Run Code Online (Sandbox Code Playgroud)
小智 20
一种替代方法,如果文件包含没有空格的字符串,每行包含1个字符串:
fileItemString=$(cat filename |tr "\n" " ")
fileItemArray=($fileItemString)
Run Code Online (Sandbox Code Playgroud)
校验:
打印整个数组:
${fileItemArray[*]}
Length=${#fileItemArray[@]}
Run Code Online (Sandbox Code Playgroud)
小智 13
你的第一次尝试很接近.这是使用您的想法的简单方法.
file="somefileondisk"
lines=`cat $file`
for line in $lines; do
echo "$line"
done
Run Code Online (Sandbox Code Playgroud)