কোনও আইটেম ব্যাশ অ্যারেতে থাকলে আমি কীভাবে পরীক্ষা করব?


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

এই স্ক্রিপ্টটি কেবল কার্যকরভাবে কাজ করে না, আমি এমন একটি স্ক্রিপ্ট চাই যা স্ল্যাক a৪ তালিকায় উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখি (আমি একটি অ্যারে ব্যবহার করি), এবং কেবল আমাকে হ্যাঁ উপস্থিত, না নেই check আমি জানি না কীভাবে একটি একক ভেরিয়েবলের সাথে অ্যারের তুলনা করা যায়।


5
কোথায় array1কাজ?
টাকোমি

উত্তর:


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 ]]মিথ্যা তবে ম্যাচ আ আ না?
গিলস কুইনট

ওপি'কে তাই জানিয়ে দেওয়া উচিত যে মানগুলিতে বিশেষ অক্ষর থাকতে পারে তবে তাকে যত্ন নিতে হবে, যেমন [ ]: চরিত্র শ্রেণি (
গ্লোবস

[[ ]]আপনি যা বলেছিলেন তার জন্য আমি বাশিতে = এবং == এর মধ্যে কোনও পার্থক্য দেখছি না । আপনি পরীক্ষা করেছেন?
গিলস কুইনট


2

এই ফাংশনটি সহযোগী অ্যারেগুলির সাথে কাজ করে।

আমরা নিম্নলিখিত ক্রিয়াকলাপটি ব্যবহার করতে পারি:

- অ্যারেতে একটি নির্দিষ্ট কী আছে কিনা তা পরীক্ষা করে দেখুন -----------------> ইন অ্যারে "মাইকি" $ {! মাইআর্রে [@]} "

- অ্যারেটিতে একটি নির্দিষ্ট মান রয়েছে কিনা তা পরীক্ষা করুন ---------> ইন অ্যারে "মাইভ্যালু" "$ {মাইআরাই [@]}"

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

আপনি এর জন্য গ্রেপ ব্যবহার করতে পারেন:

অ্যারে 1 = (প্রোভা 1 প্রোভা 2 স্ল্যাক 64)
একটি = slack64
যদি (প্রিন্টফ '% s \ n' "$; অ্যারে 1 [@]}" | গ্রেপ-এক্সকিউ $ এ); তারপর
    প্রতিধ্বনি "এটিতে"
ফাই

1
এটি ধরে নিয়েছে যে অ্যারের উপাদানগুলিতে নতুন লাইন অক্ষর নেই (এবং ফাঁকা এবং ওয়াইল্ডকার্ড যেমন আপনি উদ্ধৃত করতে ভুলে গিয়েছিলেন $a, এবং -আপনি ভুলে গিয়েছিলেন সেভাবে শুরু করবেন না --)। আপনি এর %s\0পরিবর্তে %s\nএবং ব্যবহার করতে পারেন grep --null(জিএনইউ গ্রেপ বা সামঞ্জস্য ধরে) কারণ ব্যাশ ভেরিয়েবলগুলি যেভাবেই NUL অক্ষর ধারণ করতে পারে না। আপনাকে খালি অ্যারের ক্ষেত্রে বিশেষভাবে পরিচালনা করতে হবে (যেমন প্রিন্টফ কমান্ড একই খালি উপাদানটির সাথে অ্যারে হিসাবে মুদ্রণ করবে)। এছাড়াও মনে রাখবেন যে এখানে আপনার সাব-শেল শুরু করার দরকার নেই।
স্টাফেন চেজেলাস

হ্যাঁ, এটি প্রশ্নের মতো সাধারণ অ্যারেগুলিতে প্রযোজ্য।
পেটর কেটনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.