Bash - periksa beberapa elemen dalam array

0

Saya hanya mencari cara yang tepat dan lebih elegan untuk menulis kode berikut di Bash:

in_array() {
local somearray=${1}[@]
local somevalue=${2}
for i in ${!somearray}; do
    if [[ ${i} == ${somevalue} ]]; then
        return 0
    fi
done
return 1
}

#declare array
declare -a myArray=(foo bar baz qux)

#defined values
val1=foo
val2=baz

#Ugly check if multiple strings are part of the array at the same time 
if in_array myArray $val1 && in_array myArray $val2; then
    # Do something #
else
    # Do something else#
fi

Ide dasarnya adalah bahwa saya perlu memeriksa apakah 2 ore lebih banyak nilai statis, pada saat yang sama, merupakan bagian dari array. Bertanya-tanya apakah ada cara yang lebih baik untuk melakukan ini, karena jika saya perlu memeriksa lebih dari 3-4 nilai ... if in_arraygaris itu akan menjadi besar.

Ada saran, tolong?

Terima kasih!

Marin Nedea
sumber
1
Script Anda tidak berfungsi. "$(foo, bar, baz, qux)"seharusnya mungkin (foo bar baz qux), $val22seharusnya $val2.
choroba
@ choroba - maaf .. Seharusnya saya memeriksa sintaks dengan lebih baik saat diposting. Anda benar
Marin Nedea
@ Rushur - silakan periksa lagi pertanyaan saya ..
Marin Nedea
@MarinNedea Ada saran, tolong? -->periksa jawaban dari tautan-tautan itu ... misalnya ketika mereka menyarankan =~(untuk kejelekan - itu lebih mudah dibaca) atau ketika mereka mengusulkan untuk menyanjung array dan mencari substring *"two"*(Anda dapat mencoba *$var1*&& *$var1*) ... BTW Saya pikir Anda bisa setuju lebih baik benar-benar relatif ... :-)lebih baik untuk membaca, lebih baik karena lebih efisien (Anda perlu menggunakan fungsi yang berbeda sebagai jawaban Anda ... untuk memecahkan pertama kali Anda tidak menemukan ...) ...?
Hastur

Jawaban:

3

Yah, operasi array di bash selalu jelek, seperti yang ditunjukkan oleh cara Anda sendiri untuk meneruskan array ke fungsi.

Saya akan mengonversi tes Anda menjadi for for di atas argumen yang tersisa setelah menetapkan array:

in_array () {
    local somearray=${1}[@]
    shift
    for SEARCH_VALUE in "$@"; do
        FOUND=false
        for ARRAY_VALUE in ${!somearray}; do
            if [[ $ARRAY_VALUE == $SEARCH_VALUE ]]; then
                FOUND=true
                break
            fi
        done
        if ! $FOUND; then
            return 1
        fi
    done
    return 0
}

sehingga Anda dapat memeriksa keberadaan semua nilai dalam satu panggilan fungsi:

arr=(1 2 3 4 5)
in_array arr 1 # 0
in_array arr 1 2 # 0
in_array arr 1 6 # 1
in_array arr 1 2 3 4 5 # 0
AlvaroGMJ
sumber