从bash文件中读取配对的数组

时间:2019-02-02 14:39:16

标签: arrays bash

我有一个bash脚本,该脚本将bash数组分成两对,并在任何一个元素上匹配;

declare -a arr=(
    "apple" "fruit"
    "cabbage" "vegetables"
)

for ((i=0; i<${#arr[@]}; i+=2)); do
    echo "${arr[i]} ${arr[i+1]}"
done

因此,当您运行此脚本时,它将像这样从数组中打印出每个2个元素;

# bash script
apple fruit
cabbage vegetables

并且我还可以使用${arr[i+@]}选择我想要的任何元素。

现在,我正尝试从一个单独的文本文件中读取此数组,而不是从脚本中读取该数组,因为以后将要处理此数组。

到目前为止,我已经尝试过这种方法,起初看起来很有希望,但是根本没有用;

filename='stuff.log'
filelines=`cat $filename`

for line in $filelines ; do
    props=($line)
    echo "${props[0]} ${props[1]}"
done

应该会在控制台中打印出以下内容(基本上与第一个脚本相同,即数组位于脚本内部),但实际上,它什么也不返回。

# bash script
apple fruit
cabbage vegetables

stuff.log的内部是;

"apple" "fruit"
"cabbage" "vegetables"

我基本上如何从第一个脚本的单独文件中读取数组,并且将来还能操纵数组文件的内容?

1 个答案:

答案 0 :(得分:1)

我认为,如果您信任您的输入,可以这样做:

IFS=' \n' eval props=($(<stuff.log))

Eval是邪恶的,可以在那里删除前导"和尾随"。它会正确地解析包含空格的元素。通过将文件读入数组,然后删除开头和结尾的IFS=' \n' props=($(<stuff.log)) IFS='\n' props=($(printf "%s\n" "${props[@]}" | sed 's/^"//;s/"$//')) ,我们可以做得更安全一些:

"

无论如何,我想我会在生产代码中犹豫使用这种方法。最好编写一个适当的完全解析器,将mapfile考虑在内并逐字符读取输入字符。

如果要读取一个文件到一个数组,使用readarraydotnet new mvc命令(它们是完全一样的命令)。