बैश में एक एसोसिएटिव सरणी घोषित होने पर मैं कैसे परीक्षण कर सकता हूं? मैं की तरह एक चर के लिए परीक्षण कर सकते हैं:बैश परीक्षण में यदि सहयोगी सरणी घोषित की जाती है
[ -z $FOO ] && echo nope
लेकिन मैं साहचर्य सरणियों के लिए काम करने के लिए प्रतीत नहीं होता:
$unset FOO
$declare -A FOO
$[ -z $FOO ] && echo nope
nope
$FOO=([1]=foo)
$ [ -z $FOO ] && echo nope
nope
$ echo ${FOO[@]}
foo
संपादित करें:
अपने जवाब के लिए धन्यवाद, दोनों लगते हैं काम करने के लिए मैंने गति तय करने दी:
$ cat test1.sh
#!/bin/bash
for i in {1..100000}; do
size=${#array[@]}
[ "$size" -lt 1 ] && :
done
$ time bash test1.sh #best of five
real 0m1.377s
user 0m1.357s
sys 0m0.020s
और अन्य:
$ cat test2.sh
#!/bin/bash
for i in {1..100000}; do
declare -p FOO >/dev/null 2>&1 && :
done
$ time bash test2.sh #again, the best of five
real 0m2.214s
user 0m1.587s
sys 0m0.617s
संपादित करें 2:
#!/bin/bash
for i in {1..100000}; do
[[ -v FOO[@] ]] && :
done
$ time bash test3.sh #again, the best of five
real 0m0.409s
user 0m0.383s
sys 0m0.023s
खैर कि तेजी से गया था:
आइए गति पिछले अभियानों के खिलाफ Chepner के समाधान की तुलना करें।
फिर से धन्यवाद, दोस्तों।
मैं अब तक किसी भी मामले को खोजने में असमर्थ हूं जिसमें उपरोक्त कोड में "खाद्य [@]" केवल "खाद्य" की तुलना में कोई अलग परिणाम उत्पन्न कर सकता है। यदि इरादा यह भी पता लगाना था कि फूड एक सरणी नहीं है, तो मुझे किसी भी समाधान के बारे में पता नहीं है जिसे 'घोषणा' का उपयोग करने की आवश्यकता नहीं है (नीचे दी गई सरणी आकार की जांच मदद नहीं करता है)। –
मुझे लगता है कि 'FOO {FOO @ ए} 'का उपयोग करके' नया '' '' '{' '{' {'{' {'_'' '{' '' {'{' {'{' '' '' {'{' {'{@}' '' {'{' {@} के बारे में एक ही जानकारी प्राप्त करने के लिए' घोषणा 'से बच सकता है –