2014-11-14 5 views
5

बैश में एक एसोसिएटिव सरणी घोषित होने पर मैं कैसे परीक्षण कर सकता हूं? मैं की तरह एक चर के लिए परीक्षण कर सकते हैं:बैश परीक्षण में यदि सहयोगी सरणी घोषित की जाती है

[ -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 के समाधान की तुलना करें।

फिर से धन्यवाद, दोस्तों।

उत्तर

5

bash 4.2 या बाद में, आप -v विकल्प का उपयोग कर सकते हैं:

[[ -v FOO[@] ]] && echo "FOO set" 

ध्यान दें कि किसी भी संस्करण में,

declare -A FOO 

का उपयोग कर वास्तव में तुरंत एक साहचर्य सरणी का निर्माण नहीं करता; यह सिर्फ FOO नाम पर एक विशेषता सेट करता है जो आपको को एक सहयोगी सरणी के रूप में नाम देने के लिए अनुमति देता है। सरणी स्वयं पहले असाइनमेंट तक मौजूद नहीं है।

+0

मैं अब तक किसी भी मामले को खोजने में असमर्थ हूं जिसमें उपरोक्त कोड में "खाद्य [@]" केवल "खाद्य" की तुलना में कोई अलग परिणाम उत्पन्न कर सकता है। यदि इरादा यह भी पता लगाना था कि फूड एक सरणी नहीं है, तो मुझे किसी भी समाधान के बारे में पता नहीं है जिसे 'घोषणा' का उपयोग करने की आवश्यकता नहीं है (नीचे दी गई सरणी आकार की जांच मदद नहीं करता है)। –

+0

मुझे लगता है कि 'FOO {FOO @ ए} 'का उपयोग करके' नया '' '' '{' '{' {'{' {'_'' '{' '' {'{' {'{' '' '' {'{' {'{@}' '' {'{' {@} के बारे में एक ही जानकारी प्राप्त करने के लिए' घोषणा 'से बच सकता है –

7

आप अगर एक चर घोषित किया गया है की जाँच करने के declare -p उपयोग कर सकते हैं:

declare -p FOO >/dev/null 2>&1 && echo "exists" || echo "nope" 

और विशेष रूप से साहचर्य सरणी की जाँच करने के:

[[ "$(declare -p FOO >/dev/null)" == "declare -A"* ]] && echo "array exists" || echo "nope" 
+1

आप घोषणा करने के लिए घोषणा नहीं कर सकते हैं कि चर को घोषित नहीं किया गया है या नहीं, तो चर को घोषित किया गया है या नहीं। – Jani

+1

@ जेनी सुनिश्चित नहीं है कि आप क्या कह रहे हैं। घोड़े को सेट नहीं किया गया है, तो घोषणा एक गैर-शून्य निकास स्थिति ('help' आदेश दावों के विपरीत) के विपरीत होगी। @anubhava दूसरे उदाहरण में एक टाइपो प्रतीत होता है (मुझे लगता है कि '2>/dev/null' होना चाहिए)।अन्यथा, यह एकमात्र कार्यशील उत्तर प्रतीत होता है यदि आप यह जानना चाहते हैं कि नाम को एक सहयोगी सरणी के रूप में घोषित किया गया था या नहीं। –

+0

@RonBurk: आपकी टिप्पणी के लिए धन्यवाद। '>/dev/null 2> और 1' stdout और stderr दोनों को'/dev/null' पर रीडायरेक्ट करता है, इस प्रकार हम केवल बाहर निकलने वाले कोड पर ही काम कर सकते हैं। – anubhava

2

सबसे आसान तरीकों में से एक के लिए है के आकार की जाँच सरणी:

size=${#array[@]} 
[ "$size" -lt 1 ] && echo "array is empty or undeclared" 

आप आसानी से कमांड लाइन पर इसका परीक्षण कर सकते हैं:

$ declare -A ar=([key1]=val1 [key2]=val2); echo "szar: ${#ar[@]}" 
szar: 2 

यह विधि आपको यह जांचने की अनुमति देती है कि सरणी घोषित की गई है या खाली या अव्यवस्थित है। खाली सरणी और अविकसित सरणी दोनों 0 आकार लौटाएंगे।

संबंधित मुद्दे