यदि आप रिक्त तत्वों के साथ एक सरणी का पता लगाना चाहते हैं , जैसेarr=("" "")
खाली, जैसे हीarr=()
आप सभी तत्वों को एक साथ चिपका सकते हैं और जांच सकते हैं कि परिणाम शून्य-लंबाई है या नहीं। (यदि सरणी बहुत बड़ी हो सकती है, तो सरणी सामग्री की एक चपटी प्रतिलिपि बनाना प्रदर्शन के लिए आदर्श नहीं है। लेकिन उम्मीद है कि आप इस तरह के कार्यक्रमों के लिए बैश का उपयोग नहीं कर रहे हैं ...)
लेकिन "${arr[*]}"
पहले चरित्र द्वारा अलग किए गए तत्वों के साथ फैलता है IFS
। तो आपको IFS को बचाने / पुनर्स्थापित IFS=''
करने और इस कार्य को करने की आवश्यकता है, या फिर यह जांचें कि स्ट्रिंग एलिमेंट्स == # एरे तत्वों की - 1. (एरे n
एलीमेंट्स ऑफ n-1
सेपरेटर्स)। उस ऑफ-बाय-वन से निपटने के लिए, 1 से कॉन्सेप्टेशन को पैड करना सबसे आसान है
arr=("" "")
## Assuming default non-empty IFS
## TODO: also check for ${#arr[@]} -eq 0
concat="${arr[*]} " # n-1 separators + 1 space + array elements
[[ "${#concat}" -ne "${#arr[@]}" ]] && echo not empty array || echo empty array
के साथ परीक्षण के मामले set -x
### a non-empty element
$ arr=("" "x")
+ arr=("" "x")
$ concat="${arr[*]} "; [[ "${#concat}" -ne "${#arr[@]}" ]] && echo not empty array || echo empty array
+ concat=' x '
+ [[ 3 -ne 2 ]]
+ echo not empty array
not empty array
### 2 empty elements
$ arr=("" "")
+ arr=("" "")
$ concat="${arr[*]} "; [[ "${#concat}" -ne "${#arr[@]}" ]] && echo not empty array || echo empty array
+ concat=' '
+ [[ 2 -ne 2 ]]
+ echo empty array
empty array
दुर्भाग्य से इस के लिए विफल रहता है arr=()
: [[ 1 -ne 0 ]]
। तो आपको पहले अलग से वास्तव में खाली सरणियों की जांच करनी होगी।
या के साथIFS=''
। संभवतः आप एक सब-हेल्प का उपयोग करने के बजाय IFS को सहेजना / पुनर्स्थापित करना चाहते हैं, क्योंकि आप आसानी से एक सब-आउट से परिणाम प्राप्त नहीं कर सकते।
# inside a () subshell so we don't modify our own IFS
(IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
उदाहरण:
$ arr=("" "")
$ (IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
+ IFS=
+ [[ -n '' ]]
+ echo empty array
empty array
के साथ काम करता हैarr=()
- यह अभी भी खाली स्ट्रिंग है।
=
एक स्ट्रिंग ऑपरेटर है। यह इस मामले में ठीक काम करने के लिए होता है, लेकिन मैं-eq
इसके बजाय उचित अंकगणितीय ऑपरेटर का उपयोग करूंगा (बस मामले में मैं-ge
या तो स्विच करना चाहूंगा-lt
, आदि)।