নতুন উত্তর
সংস্করণ থেকে 4.2 বাশ(এবং আরও নতুন), -v
বিল্ট-ইন test
কমান্ডের জন্য একটি নতুন বিকল্প রয়েছে ।
সংস্করণ ৪.৩ থেকে, এই পরীক্ষাটি অ্যারের উপাদানগুলিকে সম্বোধন করতে পারে।
array=([12]="red" [51]="black" [129]="blue")
for i in 10 12 30 {50..52} {128..131};do
if [ -v array[i] ];then
echo "Variable 'array[$i]' is defined"
else
echo "Variable 'array[$i]' not exist"
fi
done
Variable 'array[10]' not exist
Variable 'array[12]' is defined
Variable 'array[30]' not exist
Variable 'array[50]' not exist
Variable 'array[51]' is defined
Variable 'array[52]' not exist
Variable 'array[128]' not exist
Variable 'array[129]' is defined
Variable 'array[130]' not exist
Variable 'array[131]' not exist
এই পদ্ধতিতে একইভাবে সহযোগী অ্যারেগুলি সহ :
declare -A aArray=([foo]="bar" [bar]="baz" [baz]=$'Hello world\041')
for i in alpha bar baz dummy foo test;do
if [ -v aArray[$i] ];then
echo "Variable 'aArray[$i]' is defined"
else
echo "Variable 'aArray[$i]' not exist"
fi
done
Variable 'aArray[alpha]' not exist
Variable 'aArray[bar]' is defined
Variable 'aArray[baz]' is defined
Variable 'aArray[dummy]' not exist
Variable 'aArray[foo]' is defined
Variable 'aArray[test]' not exist
কিছুটা পার্থক্য সহ:
নিয়মিত অ্যারেগুলিতে, বন্ধনীগুলির মধ্যে পরিবর্তনশীল ( [i]
) পূর্ণসংখ্যা হয়, সুতরাং ডলারের প্রতীক ( $
) প্রয়োজন হয় না, তবে সহযোগী অ্যারেগুলির জন্য কী হিসাবে একটি শব্দ $
প্রয়োজন ( [$i]
)!
জন্য পুরানো উত্তর বাশ ভি 4.2 এর পূর্বে
দুর্ভাগ্যক্রমে, বাশ পার্থক্যকে আলাদা করার কোনও উপায় দেয় না খালি এবং অনির্ধারিত পরিবর্তনশীল।
তবে কিছু উপায় আছে:
$ array=()
$ array[12]="red"
$ array[51]="black"
$ array[129]="blue"
$ echo ${array[@]}
red black blue
$ echo ${!array[@]}
12 51 129
$ echo "${#array[@]}"
3
$ printf "%s\n" ${!array[@]}|grep -q ^51$ && echo 51 exist
51 exist
$ printf "%s\n" ${!array[@]}|grep -q ^52$ && echo 52 exist
(কোন উত্তর দিন)
এবং সহযোগী অ্যারে জন্য, আপনি একই ব্যবহার করতে পারেন:
$ unset array
$ declare -A array
$ array["key1"]="red"
$ array["key2"]="black"
$ array["key3"]="blue"
$ echo ${array[@]}
blue black red
$ echo ${!array[@]}
key3 key2 key1
$ echo ${#array[@]}
3
$ set | grep ^array=
array=([key3]="blue" [key2]="black" [key1]="red" )
$ printf "%s\n" ${!array[@]}|grep -q ^key2$ && echo key2 exist || echo key2 not exist
key2 exist
$ printf "%s\n" ${!array[@]}|grep -q ^key5$ && echo key5 exist || echo key5 not exist
key5 not exist
আপনি বাহ্যিক সরঞ্জামগুলির প্রয়োজন ছাড়াই কাজটি করতে পারেন ( খাঁটি বাশ হিসাবে কোনও প্রিন্টফ | গ্রেপ নয়) এবং কেন নয়, নতুন বাশ ফাংশন হিসাবে চেকআইফএক্সজিস্ট () তৈরি করুন :
$ checkIfExist() {
eval 'local keys=${!'$1'[@]}';
eval "case '$2' in
${keys// /|}) return 0 ;;
* ) return 1 ;;
esac";
}
$ checkIfExist array key2 && echo exist || echo don\'t
exist
$ checkIfExist array key5 && echo exist || echo don\'t
don't
বা এমনকি একটি নতুন getIfExist বাশ ফাংশন তৈরি করুন যা কাঙ্ক্ষিত মানটি প্রত্যাবর্তন করে এবং পছন্দসই মান উপস্থিত না থাকলে মিথ্যা ফলাফল-কোড সহ প্রস্থান করুন:
$ getIfExist() {
eval 'local keys=${!'$1'[@]}';
eval "case '$2' in
${keys// /|}) echo \${$1[$2]};return 0 ;;
* ) return 1 ;;
esac";
}
$ getIfExist array key1
red
$ echo $?
0
$
$ array["key4"]=""
$ getIfExist array key4
$ echo $?
0
$ getIfExist array key5
$ echo $?
1