아래 배열은 각 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 정렬( -z
aka --zero-terminated
및 -u
aka --unique
옵션에 따라 다름)로 파이프된 다음 파이프 ( aka 및 aka grep
옵션 사용 )로 연결되어 출력 줄 수를 계산합니다.-z
--null-data
-c
--count
wc
이전 버전과 달리 입력 줄이 줄바꿈으로 끝나야 하기 때문에 여기서는 사용할 수 없습니다 . 그리고 NUL을 줄바꿈으로 사용하거나 변환하면 sed
NUL 구분 기호를 사용하는 목적이 무효화됩니다. 합리적으로 대체하십시오.tr
sort
grep -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