bash에서 배열 요소가 모두 동일한지 테스트하는 방법은 무엇입니까?

bash에서 배열 요소가 모두 동일한지 테스트하는 방법은 무엇입니까?

아래 배열은 각 Linux 시스템의 디스크 수를 나타냅니다.

단일 어레이디스크에 있는 번호 포함리눅스 머신.

echo ${ARRAY_DISK_Quantity[*]}
4 4 4 4 2 4 4 4

모든 배열 값이 동일한지 확인하는 쉬운 방법은 무엇입니까?

좋은 상태로:

4 4 4 4 4 4 4 4

나쁜 기분:

4 4 4 4 4 4 2 4

나쁜 기분:

6 6 6 6 6 6 6 6 6 6 2 6 2

답변1

bash+GNU sort+GNU grep솔루션:

if [ "${#array[@]}" -gt 0 ] && [ $(printf "%s\000" "${array[@]}" | 
       LC_ALL=C sort -z -u |
       grep -z -c .) -eq 1 ] ; then
  echo ok
else
  echo bad
fi

영어 설명: 배열 요소를 고유하게 정렬하면 요소가 하나만 생성되는 경우 "ok"를 인쇄합니다. 그렇지 않으면 "bad"를 인쇄합니다.

배열은 각 요소를 구분하는 NUL 바이트로 인쇄되고, GNU 정렬( -zaka --zero-terminated-uaka --unique옵션에 따라 다름)로 파이프된 다음 파이프 ( aka 및 aka grep옵션 사용 )로 연결되어 출력 줄 수를 계산합니다.-z--null-data-c--count

wc이전 버전과 달리 입력 줄이 줄바꿈으로 끝나야 하기 때문에 여기서는 사용할 수 없습니다 . 그리고 NUL을 줄바꿈으로 사용하거나 변환하면 sedNUL 구분 기호를 사용하는 목적이 무효화됩니다. 합리적으로 대체하십시오.trsortgrep -c


다음은 함수로 다시 작성된 동일한 내용입니다.

function count_unique() {
  local LC_ALL=C

  if [ "$#" -eq 0 ] ; then 
    echo 0
  else
    echo "$(printf "%s\000" "$@" |
              sort --zero-terminated --unique |
              grep --null-data --count .)"
  fi
}



ARRAY_DISK_Quantity=(4 4 4 4 2 4 4 4)

if [ "$(count_unique "${ARRAY_DISK_Quantity[@]}")" -eq 1 ] ; then
  echo "ok"
else
  echo "bad"
fi

답변2

그리고 zsh:

if ((${#${(u)ARRAY_DISK_Quantity[@]}} == 1)); then
  echo OK
else
  echo not OK
fi

(u)확장할 매개변수 확장 플래그는 어디에 있나요?고유한가치. 그래서 우리는 배열에서 고유한 값의 개수를 얻습니다.

원하는 빈 배열 == 1로 바꾸 십시오.<= 1

를 사용하면 ksh93배열을 정렬하고 첫 번째 요소가 마지막 요소와 동일한지 확인할 수 있습니다.

set -s -- "${ARRAY_DISK_Quantity[@]}"
if [ "$1" = "${@: -1}" ]; then
  echo OK
else
  echo not OK
fi

ksh88 또는 pdksh/mksh를 사용하십시오.

set -s -- "${ARRAY_DISK_Quantity[@]}"
if eval '[ "$1" = "${'"$#"'}" ]'; then
  echo OK
else
  echo not OK
fi

를 사용하려면 bash루프가 필요할 수 있습니다.

unique_values() {
  typeset i
  for i do
    [ "$1" = "$i" ] || return 1
  done
  return 0
}
if unique_values "${ARRAY_DISK_Quantity[@]}"; then
  echo OK
else
  echo not OK
fi

(배열을 지원하는 모든 Bourne 유사 셸(ksh, zsh, bash, yash)과 함께 사용할 수 있습니다.)

빈 배열의 경우 OK를 반환합니다. [ "$#" -gt 0 ] || return함수 시작 부분에 a를 추가하고 싶지 않은 경우.

답변3

bash+awk해결책:

function get_status() {
    arr=("$@")    # get the array passed as argument
    if awk 'v && $1!=v{ exit 1 }{ v=$1 }' <(printf "%d\n" "${arr[@]}"); then 
        echo "status: Ok"
    else 
        echo "status: Bad"
    fi
}

테스트 사례 #1:

ARRAY_DISK_Quantity=(4 4 4 4 4 2 4 4)
get_status "${ARRAY_DISK_Quantity[@]}"
status: Bad

테스트 사례 #2:

ARRAY_DISK_Quantity=(4 4 4 4 4 4 4 4)
get_status "${ARRAY_DISK_Quantity[@]}"
status: Ok

답변4

bash 및 GNU grep 사용:

if grep -qE '^([0-9]+)( \1)*$' <<< "${ARRAY_DISK_Quantity[@]}"; then 
  echo "okay"
else
  echo "not okay"
fi

관련 정보