জন্য ব্যাশ , এটি একটি হ্যাক (যদিও নথিভুক্ত) একটি সামান্য বিট আছে: ব্যবহার করার প্রচেষ্টা typeset
"অ্যারে" অ্যাট্রিবিউট মুছে ফেলার জন্য:
$ typeset +a BASH_VERSINFO
bash: typeset: BASH_VERSINFO: cannot destroy array variables in this way
echo $?
1
(আপনি zsh
এটি এতে করতে পারবেন না , এটি আপনাকে কোনও অ্যারেকে একটি স্ক্যালারে রূপান্তর করতে দেয়, এতে bash
এটি স্পষ্টভাবে নিষিদ্ধ))
তাই:
typeset +A myvariable 2>/dev/null || echo is assoc-array
typeset +a myvariable 2>/dev/null || echo is array
বা কোনও ফাংশনে, শেষের দিকে সতর্কতার সাথে লক্ষ্য করা:
function typeof() {
local _myvar="$1"
if ! typeset -p $_myvar 2>/dev/null ; then
echo no-such
elif ! typeset -g +A $_myvar 2>/dev/null ; then
echo is-assoc-array
elif ! typeset -g +a $_myvar 2>/dev/null; then
echo is-array
else
echo scalar
fi
}
typeset -g
(বাশ-৪.২ বা তার পরে) এর ব্যবহারটি নোট করুন , এটি কোনও ফাংশনের মধ্যে প্রয়োজন যাতে typeset
(সিনা। declare
) local
আপনি যে মূল্যটি পরিদর্শন করার চেষ্টা করছেন তার মতো কাজ করতে এবং ক্লোবারটি কাজ না করে । এটি ফাংশন "পরিবর্তনশীল" প্রকারগুলিও পরিচালনা করে না, প্রয়োজনে আপনি অন্য একটি শাখা পরীক্ষা যুক্ত করতে পারেন typeset -f
।
আর একটি (প্রায় সম্পূর্ণ) বিকল্পটি হ'ল:
${!name[*]}
If name is an array variable, expands to the list
of array indices (keys) assigned in name. If name
is not an array, expands to 0 if name is set and
null otherwise. When @ is used and the expansion
appears within double quotes, each key expands to a
separate word.
যদিও একটি সামান্য সমস্যা আছে, 0 এর একক সাবস্ক্রিপ্ট সহ একটি অ্যারের উপরের শর্তের সাথে দুটি মিলছে। এটি এমন একটি বিষয় যা মাইক্রজারও উল্লেখ করে, ব্যাশের সত্যই কোনও শক্ত তাত্পর্য নেই এবং এর মধ্যে কিছু (যদি আপনি চেঞ্জলগটি পরীক্ষা করেন) কেএসএস এবং দায়ের করা যায় কীভাবে ${name[*]}
বা তার সাথে তুলনামূলকভাবে${name[@]}
আচরণ একটি অ-বিন্যাস করুন।
সুতরাং একটি আংশিক সমাধান হ'ল:
if [[ ${!BASH_VERSINFO[*]} == '' ]]; then
echo no-such
elif [[ ${!BASH_VERSINFO[*]} == '0' ]]; then
echo not-array
elif [[ ${!BASH_VERSINFO[*]} != '0' ]];
echo is-array
fi
আমি অতীতে এই বিষয়ে একটি প্রকরণ ব্যবহার করেছি:
while read _line; do
if [[ $_line =~ ^"declare -a" ]]; then
...
fi
done < <( declare -p )
এটিরও যদিও সাব-শেল দরকার।
আরও একটি সম্ভবত কার্যকর কৌশল হ'ল compgen
:
compgen -A arrayvar
এটি সমস্ত সূচিকৃত অ্যারে তালিকাভুক্ত করবে, তবে সহযোগী অ্যারেগুলি বিশেষভাবে পরিচালনা করা হয় না (বাশ -4.4 অবধি) এবং নিয়মিত ভেরিয়েবল হিসাবে প্রদর্শিত হবে ( compgen -A variable
)