किसी भिन्न प्रकार के सरणी का उपयोग करें: पूर्णांक-अनुक्रमित सरणी के बजाय, एक साहचर्य सरणी का उपयोग करें, इसलिए कुंजी (इंडेक्स) वह है जिसे आप जांच रहे हैं। bash-4.0
या बाद में इसके लिए आवश्यक है।
declare -A array1=(
[prova1]=1 [prova2]=1 [slack64]=1
)
a=slack64
[[ -n "${array1[$a]}" ]] && printf '%s is in array\n' "$a"
ऊपर हम वास्तव में मूल्यों के बारे में परवाह नहीं करते हैं, उन्हें इसके लिए केवल गैर-रिक्त होना चाहिए। आप कुंजी और मूल्य का आदान-प्रदान करके एक नए साहचर्य सरणी में अनुक्रमित सरणी को "उल्टा" कर सकते हैं:
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"
यदि आप बड़े सरणियों जो अक्सर खोजे जाते हैं, तो यह भुगतान कर सकते हैं, क्योंकि साहचर्य सरणियों का कार्यान्वयन सरणी-ट्रैवर्सिंग छोरों की तुलना में बेहतर प्रदर्शन करेगा। यह हर उपयोग के मामले के अनुरूप नहीं होगा, क्योंकि यह डुप्लिकेट को संभाल नहीं सकता है (हालांकि आप मूल्य को काउंटर के रूप में उपयोग कर सकते हैं, इसके बजाय ऊपर 1 के रूप में), और यह एक खाली सूचकांक को संभाल नहीं सकता है।
"उलटा" समझाने के लिए ऊपर की जटिल रेखा को तोड़कर:
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
काम करता है ?