![计算并添加某些数组是否在某个索引处有元素](https://linux22.com/image/10885/%E8%AE%A1%E7%AE%97%E5%B9%B6%E6%B7%BB%E5%8A%A0%E6%9F%90%E4%BA%9B%E6%95%B0%E7%BB%84%E6%98%AF%E5%90%A6%E5%9C%A8%E6%9F%90%E4%B8%AA%E7%B4%A2%E5%BC%95%E5%A4%84%E6%9C%89%E5%85%83%E7%B4%A0.png)
下面的代码能否用最少的代码轻松实现?
$ cluster1=(x y)
$ cluster2=(a b)
$ cluster3=(m)
$ my=$((${cluster1[0]+1}+${cluster2[0]+1}+${cluster2[0]+1}))
$ echo $my
3
$ my=$((${cluster1[1]+1}+${cluster2[1]+1}+${cluster3[1]+1}))
-bash: 1+1+: syntax error: operand expected (error token is "+")
答案1
可能是一个肮脏的伎俩,但是添加前缀 a 怎么样0
(安全,因为“替代值”是一个有效的八进制数):
my=$((0${cluster1[1]+1}+0${cluster2[1]+1}+0${cluster3[1]+1}))
echo $my
2
答案2
您的代码正在为每个未设置的元素生成语法错误。
$ echo "${cluster1[0]+1}+${cluster2[0]+1}+${cluster2[0]+1}"
1+1+1
$ echo "${cluster1[1]+1}+${cluster2[1]+1}+${cluster3[1]+1}"
1+1+
在这种情况下,最好对集合元素进行计数,而不是尝试使用生成的表达式进行计算:
#!/bin/bash
cluster1=(x y)
cluster2=(a b)
cluster3=(m)
for (( i = 0; i < 3; ++i )); do
is_set=( ${cluster1[i]+"1"} ${cluster2[i]+"1"} ${cluster3[i]+"1"} )
printf 'i=%d:\t%d\n' "$i" "${#is_set[@]}"
done
这将创建一个新数组 ,is_set
该1
数组将为每个包含索引 处的元素的数组包含i
。并不1
重要,可以是任何字符串。is_set
数组 ( )中的元素数就是该索引处数组${#is_set[@]}
中的集合元素数。cluster
测试:
$ bash script.sh
i=0: 3
i=1: 2
i=2: 0