मैं एक बैश स्क्रिप्ट लिख रहा हूं set -u, जिसमें मुझे खाली सरणी विस्तार की समस्या है: bash विस्तार के दौरान एक खाली चर के रूप में एक खाली सरणी के इलाज के लिए प्रकट होता है:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
( declare -a arrया तो मदद नहीं करता है।)
इसके लिए एक सामान्य समाधान ${arr[@]-}इसके बजाय उपयोग करना है, इस प्रकार ("अपरिभाषित") खाली सरणी के बजाय एक रिक्त स्ट्रिंग को प्रतिस्थापित करना है। हालाँकि यह एक अच्छा समाधान नहीं है, क्योंकि अब आप एक सरणी के बीच में एक खाली स्ट्रिंग और एक खाली सरणी के बीच विचार नहीं कर सकते। @ (@ विस्तार बैश में विशेष है, यह विस्तार "${arr[@]}"करता है "${arr[0]}" "${arr[1]}" …, जो इसे कमांड लाइन बनाने के लिए एक आदर्श उपकरण बनाता है।)
$ countArgs() { echo $#; }
$ countArgs a b c
3
$ countArgs
0
$ countArgs ""
1
$ brr=("")
$ countArgs "${brr[@]}"
1
$ countArgs "${arr[@]-}"
1
$ countArgs "${arr[@]}"
bash: arr[@]: unbound variable
$ set +u
$ countArgs "${arr[@]}"
0
तो क्या उस समस्या के बारे में एक तरीका है, एक सरणी में लंबाई की जाँच के अलावा if(नीचे कोड नमूना देखें), या -uउस छोटे टुकड़े के लिए सेटिंग बंद करना?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
अपडेट:bugs ikegami द्वारा स्पष्टीकरण के कारण हटाए गए टैग।

"${arr[@]}"। क्या मैं कुछ भूल रहा हूँ? मैं जो देख सकता हूं, वह कम से कम काम करता है5.x।