Di Bash 4, Anda dapat menggunakan array asosiatif:
# set up array of constants
declare -A array
for constant in foo bar baz
do
array[$constant]=1
done
# test for existence
test1="bar"
test2="xyzzy"
if [[ ${array[$test1]} ]]; then echo "Exists"; fi # Exists
if [[ ${array[$test2]} ]]; then echo "Exists"; fi # doesn't
Untuk mengatur array pada awalnya Anda juga bisa melakukan tugas langsung:
array[foo]=1
array[bar]=1
# etc.
atau dengan cara ini:
array=([foo]=1 [bar]=1 [baz]=1)
Dijeda sampai pemberitahuan lebih lanjut.
sumber
${array[$test1]}
sederhana tetapi memiliki masalah: itu tidak akan berfungsi jika Anda menggunakanset -u
skrip Anda (yang disarankan), karena Anda akan mendapatkan "variabel tidak terikat".set -u
: davidpashley.com/articles/writing-robust-shell-scripts.html , blog.hashbang0.com/2010/05/18/robust-bash-scripts-part-one , openews.net/2012/bash- script-to-write-robust .Ini adalah pertanyaan lama, tapi saya pikir apa solusi yang paling sederhana belum muncul belum:
test ${array[key]+_}
. Contoh:Output:
Untuk melihat bagaimana ini bekerja, periksa ini .
sumber
env
untuk menghindari ambiguitas dalam alias, prog dan fungsi lain yang mungkin telah mengadopsi nama "test". Seperti di atasenv test ${xs[a]+_} && echo "a is set"
. Anda juga bisa mendapatkan fungsionalitas ini menggunakan kurung ganda, trik yang sama kemudian memeriksa null:[[ ! -z "${xs[b]+_}" ]] && echo "b is set"
[[ ${xs[b]+set} ]]
Ada cara untuk menguji apakah elemen array asosiatif ada (tidak disetel), ini berbeda dengan kosong:
Kemudian gunakan:
sumber
if ! some_check then return 1
=some_check
. Jadi:isNotSet() { [[ ... ]] }
. Periksa solusi saya di bawah ini, Anda dapat melakukannya dengan cek sederhana.Anda dapat melihat apakah ada entri dengan memiparkan konten array ke grep.
Anda juga bisa mendapatkan indeks entri dengan grep -n, yang mengembalikan nomor baris pertandingan (ingat untuk mengurangi 1 untuk mendapatkan indeks berbasis nol) Ini akan cukup cepat kecuali untuk array yang sangat besar.
penjelasan:
$( ... )
sama dengan menggunakan backticks untuk menangkap output dari suatu perintah ke dalam variabelprintf
output mydata satu elemen per baris@
alih - alih*.
ini, hindari membagi "hello world" menjadi 2 baris)grep
mencari string yang tepat:^
dan$
mencocokkan awal dan akhir barisgrep -n
mengembalikan baris #, dalam bentuk 4: hello worldgrep -m 1
menemukan kecocokan pertama sajacut
ekstrak hanya nomor barisAnda tentu saja dapat melipat pengurangan menjadi perintah. Tapi kemudian uji -1 untuk hilang:
$(( ... ))
tidak bilangan bulat aritmatikasumber
Saya tidak berpikir Anda bisa melakukannya dengan benar tanpa perulangan kecuali Anda memiliki data yang sangat terbatas dalam array.
Berikut adalah satu varian sederhana, ini akan dengan benar mengatakan bahwa
"Super User"
ada dalam array. Tetapi itu juga akan mengatakan bahwa"uper Use"
ada dalam array.Masalahnya adalah bahwa tidak ada cara mudah untuk menambahkan jangkar (yang dapat saya pikirkan) selain perulangan melalui array. Kecuali jika Anda dapat menambahkannya sebelum memasukkannya ke dalam array ...
sumber
grep "\b$FINDME\b"
). Mungkin bisa bekerja dengan konstanta non-alfanumerik yang tidak memiliki spasi, dengan"(^| )$FINDME(\$| )"
(atau sesuatu seperti itu ... Saya tidak pernah bisa belajar apa rasa penggunaan regexp grep.)sumber
in_array
. Cheers${ARRAY[@]}
harus digunakan.