Bash脚本:数组元素包含空格

时间:2015-11-25 21:10:40

标签: arrays bash for-loop

我知道这个领域过去已被覆盖,但无论出于何种原因,我都无法使用我找到的所有示例。话虽如此,这是我的问题:

假设我有一个名为tmp.out的文件,其中包含以下内容:

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

我想将该文件的内容放入数组中,我这样做:

ARRAY=( `cat tmp.out` )

然后我通过for循环运行它,如此

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

但输出结果如下:

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

我希望输出为:

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

当然,除了回应我所投入的内容之外,还有更多我想做的事情,但我只是尽可能简单。我怎么解决这个问题?

3 个答案:

答案 0 :(得分:2)

您可以使用IFS变量,内部字段分隔符。将其设置为空字符串以仅在换行符上拆分内容:

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

-r需要保留文字反斜杠。

答案 1 :(得分:0)

为了迭代数组中的值,您需要引用数组扩展以避免分词:

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

当然,您还应引用该值的使用:

  echo "${i}"
done

这并没有回答如何将文件行首先放入数组的问题。如果你有bash 4.0,你可以使用mapfile内置:

mapfile -t values < tmp.out

否则,您需要暂时将IFS的值更改为单个换行符,或使用read内置的循环。

答案 2 :(得分:0)

控制分词的另一种简单方法是控制内部字段分隔符(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

<强>输入

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

<强>输出

$ 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'