উত্তর:
বাশ 4 এ, আপনি সহযোগী অ্যারে ব্যবহার করতে পারেন:
# 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
প্রাথমিকভাবে অ্যারে সেট আপ করতে আপনি সরাসরি অ্যাসাইনমেন্টও করতে পারেন:
array[foo]=1
array[bar]=1
# etc.
বা এইভাবে:
array=([foo]=1 [bar]=1 [baz]=1)
${array[$test1]}
সহজ তবে সমস্যা রয়েছে: আপনি set -u
যদি আপনার স্ক্রিপ্টগুলিতে (যা প্রস্তাবিত) ব্যবহার করেন তবে এটি কাজ করবে না , কারণ আপনি "আনবাউন্ড ভেরিয়েবল" পেয়ে যাবেন।
set -u
: ডেভিডপ্যাশলে.com / articles / writing-robust- shell- scriptts.html , blog.hashbang0.com/2010/05/18/robust-bash-scriptts-part-one , openews.net/2012/bash- স্ক্রিপ্ট-টু-লেখা-শক্তসমর্থ ।
এটি একটি পুরানো প্রশ্ন, কিন্তু আমি মনে করি কি সহজ সমাধান এখনো হাজির করেনি: test ${array[key]+_}
। উদাহরণ:
declare -A xs=([a]=1 [b]="")
test ${xs[a]+_} && echo "a is set"
test ${xs[b]+_} && echo "b is set"
test ${xs[c]+_} && echo "c is set"
আউটপুট:
a is set
b is set
কিভাবে এই কাজ পরীক্ষা দেখার জন্য এই ।
env
"পরীক্ষা" নামটি গ্রহণ করে থাকতে পারে এমন অন্যান্য উপকরণ, অগ্রগতি এবং অন্যান্য ক্রিয়াকলাপগুলিতে অস্পষ্টতা এড়াতে আপনাকে পুনরায় স্মরণ করে। উপরে হিসাবে env test ${xs[a]+_} && echo "a is set"
। আপনি ডাবল-বন্ধনী ব্যবহার করে এই কার্যকারিতাটিও পেতে পারেন, একই কৌশলটি পরে নাল পরীক্ষা করা:[[ ! -z "${xs[b]+_}" ]] && echo "b is set"
[[ ${xs[b]+set} ]]
যদি কোনও এসোসিয়েটিভ অ্যারের উপাদান উপস্থিত থাকে (সেট না করা) থাকে তা পরীক্ষা করার একটি উপায় রয়েছে, এটি খালি থেকে পৃথক:
isNotSet() {
if [[ ! ${!1} && ${!1-_} ]]
then
return 1
fi
}
তারপরে এটি ব্যবহার করুন:
declare -A assoc
KEY="key"
isNotSet assoc[${KEY}]
if [ $? -ne 0 ]
then
echo "${KEY} is not set."
fi
if ! some_check then return 1
= some_check
। তাই: isNotSet() { [[ ... ]] }
। আমার সমাধানটি নীচে পরীক্ষা করুন, আপনি এটি একটি সাধারণ চেক করে করতে পারেন।
অ্যারে বিষয়বস্তু গ্রেপ করে পাইপ করে কোনও প্রবেশিকা উপস্থিত রয়েছে কিনা তা আপনি দেখতে পাচ্ছেন।
printf "%s\n" "${mydata[@]}" | grep "^${val}$"
আপনি গ্রেপ-এন এর সাথে একটি এন্ট্রির সূচকও পেতে পারেন, যা ম্যাচের লাইন নম্বর দেয় (শূন্য-ভিত্তিক সূচক পেতে 1 টি বিয়োগের কথা মনে রাখবেন) এটি খুব বড় অ্যারে বাদে যুক্তিসঙ্গত দ্রুত হবে।
# given the following data
mydata=(a b c "hello world")
for val in a c hello "hello world"
do
# get line # of 1st matching entry
ix=$( printf "%s\n" "${mydata[@]}" | grep -n -m 1 "^${val}$" | cut -d ":" -f1 )
if [[ -z $ix ]]
then
echo $val missing
else
# subtract 1. Bash arrays are zero-based, but grep -n returns 1 for 1st line, not 0
echo $val found at $(( ix-1 ))
fi
done
a found at 0
c found at 2
hello missing
hello world found at 3
ব্যাখ্যা:
$( ... )
কোনও ভেরিয়েবলের কমান্ডের আউটপুট ক্যাপচার করতে ব্যাকটিক্স ব্যবহার করা সমান printf
প্রতি লাইনে মাইডাটা এক উপাদান আউটপুট করে @
পরিবর্তে *.
"হ্যালো ওয়ার্ল্ড" কে 2 লাইনে বিভক্ত করা এড়ানো যায়)grep
সঠিক স্ট্রিংয়ের সন্ধান করে: ^
এবং $
শুরু এবং লাইনের শেষের সাথে মেলেgrep -n
4 টি আকারে লাইন প্রত্যাবর্তন করে: হ্যালো ওয়ার্ল্ড grep -m 1
প্রথম ম্যাচটি সন্ধান করেcut
শুধু লাইন নম্বর নিষ্কাশন আপনি অবশ্যই বিয়োগফলটি কমান্ডে ভাঁজ করতে পারেন। তবে তারপরে -১ এর জন্য নিখোঁজ হওয়ার জন্য পরীক্ষা করুন:
ix=$(( $( printf "%s\n" "${mydata[@]}" | grep -n -m 1 "^${val}$" | cut -d ":" -f1 ) - 1 ))
if [[ $ix == -1 ]]; then echo missing; else ... fi
$(( ... ))
পূর্ণসংখ্যার গাণিতিক করেআপনার মনে না হয় আপনি লুপিং না করে সঠিকভাবে এটি করতে পারবেন properly অ্যারে খুব সীমিত ডেটা ।
এখানে একটি সহজ বৈকল্পিক, এটি সঠিকভাবে বলবে যে "Super User"
অ্যারে বিদ্যমান। কিন্তু এটি "uper Use"
অ্যারের মধ্যেও বলবে ।
MyArray=('Super User' 'Stack Overflow' 'Server Fault' 'Jeff' );
FINDME="Super User"
FOUND=`echo ${MyArray[*]} | grep "$FINDME"`
if [ "${FOUND}" != "" ]; then
echo Array contains: $FINDME
else
echo $FINDME not found
fi
#
# If you where to add anchors < and > to the data it could work
# This would find "Super User" but not "uper Use"
#
MyArray2=('<Super User>' '<Stack Overflow>' '<Server Fault>' '<Jeff>' );
FOUND=`echo ${MyArray2[*]} | grep "<$FINDME>"`
if [ "${FOUND}" != "" ]; then
echo Array contains: $FINDME
else
echo $FINDME not found
fi
সমস্যাটি হ'ল অ্যারের মাধ্যমে লুপিংয়ের পাশাপাশি অ্যাঙ্করগুলি যুক্ত করার কোনও সহজ উপায় নেই (যা আমি ভাবতে পারি)। অ্যারে রাখার আগে আপনি এগুলিকে যোগ না করতে পারলে ...
grep "\b$FINDME\b"
)। সম্ভবত অ-আলফানিউমারিক ধ্রুবকগুলির সাথে কোনও ফাঁকা স্থান নেই, দিয়ে কাজ "(^| )$FINDME(\$| )"
করতে পারে (অথবা এর মতো কিছু ... আমি কখনই
#!/bin/bash
function in_array {
ARRAY=$2
for e in ${ARRAY[*]}
do
if [[ "$e" == "$1" ]]
then
return 0
fi
done
return 1
}
my_array=(Drupal Wordpress Joomla)
if in_array "Drupal" "${my_array[*]}"
then
echo "Found"
else
echo "Not found"
fi
in_array
। চিয়ার্স
${ARRAY[@]}
ব্যবহার করা উচিত।