일부 배열에 특정 인덱스에 요소가 있는지 계산하고 추가합니다.

일부 배열에 특정 인덱스에 요소가 있는지 계산하고 추가합니다.

최소한의 코드로 다음 코드를 쉽게 구현할 수 있나요?

$ 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("대체 값"은 유효한 8진수이므로 안전합니다).

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

그러면 index 의 요소를 포함하는 각 배열을 포함하는 is_set새 배열이 생성됩니다 . 상관 없습니다 . 임의의 문자열이 될 수 있습니다. array( )의 요소 수는 해당 인덱스에 있는 배열의 컬렉션 요소 수입니다.1i1is_set${#is_set[@]}cluster

시험:

$ bash script.sh
i=0:    3
i=1:    2
i=2:    0

관련 정보