How can I handle an array where elements contain spaces in Bash?

半腔热情 提交于 2020-06-17 08:06:44

问题


Let's say I have a file named tmp.out that contains the following:

c:\My files\testing\more files\stuff\test.exe
c:\testing\files here\less files\less stuff\mytest.exe

I want to put the contents of that file into an array and I do it like so:

ARRAY=( `cat tmp.out` )

I then run this through a for loop like so

for i in ${ARRAY[@]};do echo ${i}; done

But the output ends up like this:

c:\My
files\testing\more
files\stuff\test.sas
c:\testing\files
here\less
files\less
stuff\mytest.sas

and I want the output to be:

c:\My files\testing\more files\stuff\test.exe
c:\testing\files here\less files\less stuff\mytest.exe

How can I resolve this?


回答1:


You can use the IFS variable, the Internal Field Separator. Set it to empty string to split the contents on newlines only:

while IFS= read -r line ; do
    ARRAY+=("$line")
done < tmp.out

-r is needed to keep the literal backslashes.




回答2:


In order to iterate over the values in an array, you need to quote the array expansion to avoid word splitting:

for i in "${values[@]}"; do 

Of course, you should also quote the use of the value:

  echo "${i}"
done

That doesn't answer the question of how to get the lines of a file into an array in the first place. If you have bash 4.0, you can use the mapfile builtin:

mapfile -t values < tmp.out

Otherwise, you'd need to temporarily change the value of IFS to a single newline, or use a loop over the read builtin.




回答3:


Another simple way to control word-splitting is by controlling the Internal Field Separator (IFS):

#!/bin/bash

oifs="$IFS"  ## save original IFS
IFS=$'\n'    ## set IFS to break on newline

array=( $( <dat/2lines.txt ) )  ## read lines into array

IFS="$oifs"  ## restore original IFS

for ((i = 0; i < ${#array[@]}; i++)) do
    printf "array[$i] : '%s'\n" "${array[i]}"
done

Input

$ cat dat/2lines.txt
c:\My files\testing\more files\stuff\test.exe
c:\testing\files here\less files\less stuff\mytest.exe

Output

$ bash arrayss.sh
array[0] : 'c:\My files\testing\more files\stuff\test.exe'
array[1] : 'c:\testing\files here\less files\less stuff\mytest.exe'


来源:https://stackoverflow.com/questions/33926461/how-can-i-handle-an-array-where-elements-contain-spaces-in-bash

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!