Array berikut mewakili jumlah disk pada setiap mesin linux
Setiap array tunggal termasuk jumlah disk pada mesin linux .
echo ${ARRAY_DISK_Quantity[*]}
4 4 4 4 2 4 4 4
apa cara sederhana untuk mengidentifikasi bahwa semua nilai array sama?
Status yang baik:
4 4 4 4 4 4 4 4
Status salah:
4 4 4 4 4 4 2 4
Status salah:
6 6 6 6 6 6 6 6 6 6 2 6 2
bash
shell-script
awk
array
yael
sumber
sumber
Jawaban:
bash
+ GNUsort
+grep
solusi GNU :Penjelasan bahasa Inggris: jika mengurutkan secara unik elemen-elemen dari array hanya menghasilkan satu elemen, lalu cetak "ok". Kalau tidak cetak "buruk".
Array dicetak dengan byte NUL yang memisahkan setiap elemen, disalurkan ke semacam GNU (mengandalkan opsi
-z
alias--zero-terminated
dan-u
alias--unique
), dan kemudian kegrep
(menggunakan opsi-z
alias--null-data
dan-c
alias--count
) untuk menghitung garis output.Tidak seperti versi saya sebelumnya, saya tidak dapat menggunakan di
wc
sini karena membutuhkan jalur input yang diakhiri dengan baris baru ... dan menggunakansed
atautr
untuk mengkonversi NUL ke baris baru setelahsort
akan mengalahkan tujuan menggunakan pemisah NUL.grep -c
membuat pengganti yang masuk akal.Inilah hal yang sama ditulis ulang sebagai fungsi:
sumber
sort -u
tidak mengembalikan elemen unik tetapi salah satu dari setiap set elemen yang mengurutkannya sama. Sebagai contoh, ini akan mengatakan "ok" padaARRAY_DISK_Quantity=(① ②)
sistem GNU di mana lokal biasanya memutuskan 2 karakter semacam itu sama. Anda inginLC_ALL=C sort -u
keunikan byte-ke-byte.Dengan
zsh
:Di mana
(u)
bendera ekspansi parameter untuk memperluas nilai unik . Jadi kami mendapatkan hitungan nilai unik dalam array.Ganti
== 1
dengan<= 1
apakah Anda ingin menganggap array kosong adalah OK.Dengan
ksh93
, Anda bisa mengurutkan array dan memeriksa apakah elemen pertama sama dengan yang terakhir:Dengan ksh88 atau pdksh / mksh:
Dengan
bash
, Anda mungkin perlu loop:(akan bekerja dengan semua shell Bourne-like dengan dukungan array (ksh, zsh, bash, yash)).
Perhatikan bahwa ia mengembalikan OK untuk array kosong. Tambahkan a
[ "$#" -gt 0 ] || return
di awal fungsi jika Anda tidak menginginkannya.sumber
bash
?typeset
mengatakanObsolete. See `help declare'.
Apakah ada alasan Anda menggunakannya, bukanlocal
ataudeclare
?typeset
adalah yang bekerja di semua 4 shell. Ini juga yang asli dari ksh di awal 80-an (kebanyakan bash disalin ksh88 ketika datang ke pengaturan jenis variabel dan deklarasi tetapi memutuskan untuk mengganti namatypeset
declare
dan membuattypeset
alias untuk menyatakan).bash
+awk
soltion:Test case # 1:
Test case # 2:
sumber
Saya punya solusi bash only yang harus bekerja dengan string juga:
Demonstrasi:
sumber
Dengan bash dan GNU grep:
sumber
Berikut adalah POSIX Awk:
sumber
solusi bash only (dengan asumsi
a
adalahARRAY_DISK_Quantity
)sumber
if [ "$ttt" -ne "$i" ]; then res=1; break; fi;
Gunakan for for untuk membandingkan setiap elemen array dengan yang berikutnya. Akhiri loop satu iterasi kurang dari panjang array untuk menghindari membandingkan elemen terakhir dengan apa pun di akhir.
sumber