다음 배열은 각 Linux 시스템의 디스크 수를 나타냅니다.
각 단일 어레이 에는 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
답변
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”를 인쇄하십시오. 그렇지 않으면 “나쁜”을 인쇄하십시오.
어레이가 NUL 각 소자 분리 바이트 인쇄 (온 의존 정렬로 GNU 파이프 -z
일명 --zero-terminated
과 -u
일명 --unique
옵션) 다음에 grep
(옵션을 사용하여 -z
일명 --null-data
과 -c
일명 --count
출력 라인을 계산).
이전 버전과 달리 wc
줄 바꿈으로 끝나는 입력 줄이 필요하기 때문에 여기에서 사용할 수 없으며 NUL 구분 기호 사용의 목적 을 상실한 후 NUL을 줄 바꿈으로 사용 sed
하거나 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
답변
로 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
배열 지원 (ksh, zsh, bash, yash)이있는 모든 Bourne과 같은 셸에서 작동합니다.
빈 배열에 대해서는 OK를 반환합니다. [ "$#" -gt 0 ] || return
원하지 않는 경우 함수 시작 부분에 a 를 추가하십시오 .
답변
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
답변
문자열과 함께 작동 해야하는 또 다른 bash 전용 솔루션이 있습니다.
isarray.equal () {
local placeholder="$1"
local num=0
while (( $# )); do
if [[ "$1" != "$placeholder" ]]; then
num=1
echo 'Bad' && break
fi
shift
done
[[ "$num" -ne 1 ]] && echo 'Okay'
}
데모:
[root@JBSTEST001 ~]# ARRAY_DISK_Quantity=(4 4 4 4 2 4 4 4)
[root@JBSTEST001 ~]# isarray.equal "${ARRAY_DISK_Quantity[@]}"
Bad
[root@JBSTEST001 ~]# ARRAY_DISK_Quantity=(4 4 4 4 4 4 4 4)
[root@JBSTEST001 ~]# isarray.equal "${ARRAY_DISK_Quantity[@]}"
Okay
[root@JBSTEST001 ~]# ARRAY_DISK_Quantity=(four four four four two four four four)
[root@JBSTEST001 ~]# isarray.equal "${ARRAY_DISK_Quantity[@]}"
Bad
[root@JBSTEST001 ~]# ARRAY_DISK_Quantity=(four four four four four four four four)
[root@JBSTEST001 ~]# isarray.equal "${ARRAY_DISK_Quantity[@]}"
Okay
답변
bash와 GNU grep으로 :
if grep -qE '^([0-9]+)( \1)*$' <<< "${ARRAY_DISK_Quantity[@]}"; then
echo "okay"
else
echo "not okay"
fi
답변
POSIX Awk는 다음과 같습니다.
awk 'BEGIN {while (++z < ARGC) if (ARGV[z] != ARGV[1]) exit 1}' "${ARRAY_DISK_Quantity[@]}"
답변
떠들썩한 파티 만 용액 (가정 a
된다 ARRAY_DISK_Quantity
)
ttt=${a[0]}
res=0
for i in "${a[@]}"
do
let res+=$(if [ "$ttt" -ne "$i" ]; then echo 1; else echo 0; fi);
done
if [ "$res" -eq 0 ]
then
echo "ok"
else
echo "bad"
fi