Contando e adicionando se alguns arrays tiverem elemento em algum índice

1

Por favor, informe se abaixo pode ser facilmente alcançado com o mínimo de codificação.

$ 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 "+")
    
por Bharat 15.09.2018 / 07:29

2 respostas

0

Seu código está gerando um erro de sintaxe para cada elemento que não está definido.

$ 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+

Seria melhor contar os elementos do conjunto em vez de tentar calcular com uma expressão gerada neste caso:

#!/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

Isso cria uma nova matriz, is_set , que conterá 1 para cada matriz que contém um elemento no índice i . O 1 não é importante e pode ser qualquer string. O número de elementos na matriz is_set ( ${#is_set[@]} ) é o número de elementos de conjunto das matrizes cluster nesse índice.

Teste:

$ bash script.sh
i=0:    3
i=1:    2
i=2:    0
    
por 15.09.2018 / 09:32
1

Pode ser um truque sujo, mas que tal prefixar um 0 (seguro como o "Valor alternativo" é um número octal válido):

my=$((0${cluster1[1]+1}+0${cluster2[1]+1}+0${cluster3[1]+1}))
echo $my
2
    
por 15.09.2018 / 10:39