我正在编写一个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){...});
这发生了什么?我的功能有什么问题吗?
答案 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