Bash shell将文件读取到数组的函数

时间:2016-08-17 17:34:03

标签: bash shell

我正在编写一个shell脚本函数,它读取给定文件并将数据存储到2D数组中。

File.txt

a1 b1 c1
a2 b2 c2
a3 b3 c3
# Let's just assume 3 rows

我们的想法是使用reference eval通过read_data File.txt array num_rows传递存储,功能签名为read_data() { if [ ! -f $1 ]; then echo "Failed to read hosts ($1 not found)"; exit; fi while read -r line; do # skip the comments { [[ "$line" =~ ^#.*$ ]] || [[ -z $line ]] ;} && continue # Parse the line read -a tokens <<< $line if [ ${#tokens[@]} == 3 ]; then # Extract the user/host/home eval $2[\$$3, 0]=\${tokens[0]} eval $2[\$$3, 1]=\${tokens[1]} eval $2[\$$3, 2]=\${tokens[2]} eval $3=$(($3+1)) else echo "Wrong line format '$line'" fi done < $1 }

declare -a array
num_rows=0
read_data File.txt array num_rows

在下面打电话

num_rows

我得到的是3等于pnt_data() { for ((i=0; i<$2; i++)); do eval a=\${$1[$i, 0]} eval b=\${$1[$i, 1]} eval c=\${$1[$i, 2]} echo $a $b $c done } pnt_data array num_rows a3 b3 c3 a3 b3 c3 a3 b3 c3 ,但存储在数组中的内容是

ItemCatalog.find({"items.isActive" : true},{'items.$' : 1}).populate('items.$.idType').populate('items.$.idUnit').exec(function(err,result){...});

这发生了什么?我的功能有什么问题吗?

1 个答案:

答案 0 :(得分:4)

数组索引在算术上下文中计算,逗号运算符通过计算左侧操作数,忽略它,然后计算右侧操作数来工作。例如:

$ echo $((3,0))
0
$ echo $((3+9,0))
0
$ echo $((a,0))
0

因此,以下所有分配都等同于foo[0]=bar

foo[3,0]=bar     # ignore 3
foo[3+9,0]=bar   # 3+9=12, ignore 12
foo[a,0]=bar     # ignore whatever the value of a is

如果要模拟多维索引,则需要使用关联数组,以便用作索引的字符串在使用之前不会进行算术扩展。

declare -A array  # capital A, not lowercase a
num_rows=0
read_data File.txt array num_rows