Sử dụng một loại mảng khác: thay vì mảng được lập chỉ mục số nguyên, sử dụng mảng kết hợp, vì vậy khóa (chỉ mục) là thứ bạn sẽ kiểm tra. bash-4.0
hoặc sau này là cần thiết cho việc này.
declare -A array1=(
[prova1]=1 [prova2]=1 [slack64]=1
)
a=slack64
[[ -n "${array1[$a]}" ]] && printf '%s is in array\n' "$a"
Ở trên chúng tôi không thực sự quan tâm đến các giá trị, chúng chỉ cần không trống cho việc này. Bạn có thể "đảo ngược" một mảng được lập chỉ mục thành một mảng kết hợp mới bằng cách trao đổi khóa và giá trị:
declare -a array1=(
prova1 prova2 slack64
)
declare -A map # required: declare explicit associative array
for key in "${!array1[@]}"; do map[${array1[$key]}]="$key"; done # see below
a=slack64
[[ -n "${map[$a]}" ]] && printf '%s is in array\n' "$a"
Điều này có thể trả hết nếu bạn có các mảng lớn thường được tìm kiếm, vì việc thực hiện các mảng kết hợp sẽ hoạt động tốt hơn các vòng lặp đi qua mảng. Mặc dù vậy, nó sẽ không phù hợp với mọi trường hợp sử dụng, vì nó không thể xử lý các bản sao (mặc dù bạn có thể sử dụng giá trị làm bộ đếm, thay vì chỉ 1 như trên) và nó không thể xử lý một chỉ mục trống.
Phá vỡ dòng phức tạp ở trên, để giải thích "nghịch đảo":
for key in "${!a[@]}" # expand the array indexes to a list of words
do
map[${a[$key]}]="$key" # exchange the value ${a[$key]} with the index $key
done
array1
làm việc?