विश्वसनीय संस्करण-स्वतंत्र (3.2 .. 4.4) '-यू' मोड में बैश खाली सरणी हैंडलिंग का तरीका - सरणी, बैश

जबकि समाधान में सुझाव दिया गया `Set -u` के साथ बैश खाली सरणी विस्तार मेरे लिए बहुत अच्छा काम किया, हाल ही में जारी किए गए सरणी हैंडलिंग को बदल दिया गया है (2016/09/16) बैश 4.4 (उदाहरण के लिए डेबियन खिंचाव में उपलब्ध)।

$ bash --version | head -n1
bash --version | head -n1
GNU bash, version 4.4.0(1)-release (x86_64-pc-linux-gnu)

अब रिक्त सरणी विस्तार चेतावनी को उत्सर्जित नहीं करता है

$ set -u
$ arr=()
$ echo "${arr[@]}"

$ # everything is fine

संबंधित प्रश्न में प्रस्तावित समाधान बैश-4.4 के साथ विफल रहता है:

$ set -u
$ arr2=()
$ arr2=( ${arr2[@] + "${arr2[@]}"} "foo" )
bash: ${arr2[@] + "$arr2[@]"}: bad substitution

क्या किसी को सरणी लंबाई या बैश संस्करण के लिए अतिरिक्त चेक के बिना (अधिक या कम) संस्करण-स्वतंत्र समाधान पर सुझाव मिलते हैं? मैं अभी भी नवीनतम बैश परिवर्तनों की जांच करने पर हूं

संपादित करें

जैसा कि मेरा प्रारंभिक प्रश्न कुछ हद तक भ्रमित प्रतीत होता है, यहां मैं जो हासिल करने की कोशिश करता हूं उसका स्पष्टीकरण यहां दिया गया है। टेस्ट स्क्रिप्ट:

#!/usr/bin/env bash
set -euo pipefail
bash --version | head -n1

arr=()

# some external environment variables are set / command line arguments passed to script
if test -n "${USE_EXTRA_ARGUMENT_1-}" ; then
arr=( ${arr[@] + "${arr[@]}"} "foo" )
fi

if test -n "${USE_EXTRA_ARGUMENT_2-}" ; then
arr=( ${arr[@] + "${arr[@]}"} "bar" )
fi

# just a dummy command
echo "${arr[@]-}"

बैश 4.3 (आर्क लिनक्स) रन:

$ USE_EXTRA_ARGUMENT_1=baz bash xxx.sh
GNU bash, version 4.3.46(1)-release (x86_64-unknown-linux-gnu)
foo

बैश 4.4 (डेबियन खिंचाव) रन:

$ USE_EXTRA_ARGUMENT_1=baz bash xxx.sh
GNU bash, version 4.4.0(1)-release (x86_64-pc-linux-gnu)
xxx.sh: line 9: ${arr[@] + "${arr[@]}"}: bad substitution

या मैं बैश सरणी का उपयोग करने में गंभीरता से गलत हूँ?

उत्तर:

जवाब के लिए 5 № 1

पहले अंतरिक्ष + गलत है; तुम्हारा मतलब है

arr2=( ${arr2[@]+"${arr2[@]}"} "foo" )

यह उपयोग करने के लिए, हालांकि, बहुत आसान है += ऑपरेटर।

arr2+=(foo)

संबंधित सवाल
सबसे लोकप्रिय