Inilah pendapat saya tentang ini.
Saya lebih suka tidak menggunakan bash untuk loop jika saya bisa menghindarinya, karena itu membutuhkan waktu untuk berjalan. Jika ada sesuatu yang harus diulang, biarkan itu menjadi sesuatu yang ditulis dalam bahasa tingkat yang lebih rendah daripada skrip shell.
function array_contains { # arrayname value
local -A _arr=()
local IFS=
eval _arr=( $(eval printf '[%q]="1"\ ' "\${$1[@]}") )
return $(( 1 - 0${_arr[$2]} ))
}
Ini bekerja dengan membuat array asosiatif sementara _arr
,, yang indeksnya diturunkan dari nilai-nilai array input. (Perhatikan bahwa array asosiatif tersedia di bash 4 dan di atas, jadi fungsi ini tidak akan berfungsi di versi bash yang lebih lama.) Kami menetapkan $IFS
untuk menghindari pemisahan kata di spasi putih.
Fungsi tidak mengandung loop eksplisit, meskipun secara internal bash langkah melalui array input untuk mengisi printf
. Format printf digunakan %q
untuk memastikan bahwa data input lolos sehingga mereka dapat dengan aman digunakan sebagai kunci larik.
$ a=("one two" three four)
$ array_contains a three && echo BOOYA
BOOYA
$ array_contains a two && echo FAIL
$
Perhatikan bahwa semua fungsi yang digunakan fungsi ini adalah bawaan untuk bash, jadi tidak ada pipa eksternal yang menyeret Anda ke bawah, bahkan dalam ekspansi perintah.
Dan jika Anda tidak suka menggunakan eval
... yah, Anda bebas menggunakan pendekatan lain. :-)