यदि कोई आइटम बैश सरणी में है तो मैं कैसे परीक्षण करूं?


15

एक साधारण स्क्रिप्ट के लिए मदद करें

#!/bin/bash

array1=(
prova1
prova2
slack64
)

a="slack64"
b="ab"

if [ $a = $b ]
then
      echo "$a = $b : a is equal to b"
else
      echo "$a = $b: a is not equal to b"
fi

यह स्क्रिप्ट बस काम नहीं करती है, मैं एक स्क्रिप्ट चाहता हूं जो यह जांचती है कि क्या slack64 एक सूची में मौजूद है (मैं एक सरणी का उपयोग करता हूं), और बस मुझे देता हूं, हां मौजूद है, या नहीं। मुझे नहीं पता कि किसी एकल चर के साथ एक सरणी की तुलना कैसे करें।


5
कहां array1काम करता है ?
tachomi

जवाबों:


18

किसी भिन्न प्रकार के सरणी का उपयोग करें: पूर्णांक-अनुक्रमित सरणी के बजाय, एक साहचर्य सरणी का उपयोग करें, इसलिए कुंजी (इंडेक्स) वह है जिसे आप जांच रहे हैं। 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

14

सीधा रास्ता एक लूप के साथ चलना है:

var=ab
for item in "${array[@]}"; do
    [[ $var == "$item" ]] && echo "$var present in the array"
done

? [[ a == aaa ]]गलत है लेकिन एक मैच आ गया है ना?
गिलेस कोटेन

SO को ओपी को सूचित किया जाना चाहिए कि उसे ध्यान रखना है कि क्या मूल्यों में विशेष वर्ण हो सकते हैं, जैसे [ ]: चरित्र वर्ग (
ग्लब्स

[[ ]]आपने जो कहा उसके लिए मैं और == के बीच कोई अंतर नहीं देखता । क्या आपने परीक्षण किया है?
गिल्स केनॉट


2

यह फ़ंक्शन साहचर्य सरणियों के साथ काम करता है।

हम निम्न में से एक करने के लिए इस फ़ंक्शन का उपयोग कर सकते हैं:

- जांचें कि क्या सरणी में एक निश्चित कुंजी है -----------------> inArray "myKey" $ {! myArray [@]} "

- जांचें कि क्या सरणी में एक निश्चित मान है ---------> inArray "myValue" "$ {myArray [@]}"

function inArray # ( keyOrValue, arrayKeysOrValues ) 
{
  local e
  for e in "${@:2}"; do 
    [[ "$e" == "$1" ]] && return 0; 
  done
  return 1
}

declare -A arr
arr[doo]=55

inArray "doo" "${!arr[@]}"
echo $?     # 0 
inArray "bla" "${!arr[@]}"
echo $?     # 1 
inArray "55" "${arr[@]}"
echo $?     # 0

2

आप उसके लिए grep का उपयोग भी कर सकते हैं:

array1 = (prova1 prova2 slack64)
एक = slack64
अगर (Printf '% s \ n' "$ {array1 [@]}" | grep -xq $ a); फिर
    गूंज "यह में है"
फाई

1
यह मानते हुए कि एलीमेंट तत्वों में न्यूलाइन वर्ण (और ब्लैंक और वाइल्डकार्ड शामिल नहीं हैं, जैसे कि आप उद्धृत करना भूल गए हैं $a, और -जैसा कि आप भूल गए थे उससे शुरू नहीं करें --)। आप उपयोग कर सकते हैं और उपयोग करने के %s\0बजाय (GNU grep या संगत मानकर) बैश चर के रूप में वैसे भी NUL वर्ण शामिल नहीं कर सकते। आपको विशेष रूप से एक खाली सरणी के मामले को संभालने की आवश्यकता होगी (जैसा कि प्रिंटफ कमांड एक खाली जगह के साथ एक सरणी के लिए उसी चीज को प्रिंट करेगा)। यह भी ध्यान दें कि आपको यहां एक सब-आरंभ शुरू करने की आवश्यकता नहीं है। %s\ngrep --null
स्टीफन चेज़लस

हां, यह प्रश्न में एक की तरह सरल सरणियों पर लागू होता है।
बजे पेट्र केटनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.