我知道这个领域过去已被覆盖,但无论出于何种原因,我都无法使用我找到的所有示例。话虽如此,这是我的问题:
假设我有一个名为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
当然,除了回应我所投入的内容之外,还有更多我想做的事情,但我只是尽可能简单。我怎么解决这个问题?
答案 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'