बश में चर करने के लिए डिफ़ॉल्ट सरणी लिखें


10

मैं उम्मीद कर रहा था

excludes="${excludes:-( ${default_excludes[@]} )}"

$excludesखाली हो तो एक सरणी हो । दुर्भाग्य से सामान के बाद :-एक स्ट्रिंग होने के लिए लिया जाता है। क्या मुझे कुछ सिंटैक्स गर्भपात याद आया, या क्या मुझे क्लूनी का उपयोग करना है

if [ -z "${excludes:-}" ]
then
    excludes=( "${default_excludes[@]}" )
fi

?

जवाबों:


10

आप इस वाक्य रचना के साथ एक और सरणी से एक सरणी का निर्माण कर सकते हैं:

arr1=( "${arr2[@]}" )

इस डिफ़ॉल्ट-मूल्य सिंटैक्स में इसका अनुवाद किया जा सकता है:

arr1=("${arr1[@]:-${arr2[@]}}")

मैंने कुछ किनारे के मामलों का परीक्षण किया है, जैसे रिक्त स्थान वाले सरणी सदस्य या उनमें नई सूचियाँ और उन्हें सही ढंग से संभालना प्रतीत होता है।


3
अगर arr2 एक खाली है, तो arr1 एक खाली स्ट्रिंग के साथ लंबाई का एक सरणी बन जाता है
Andy

2

चूँकि मेरे पास ऐसे मामले थे जहाँ मेरा स्थान arr2खाली हो सकता था, लेकिन सेट किया गया था, मुझे एक सरल समाधान नहीं मिला। इसलिए मुझे एक फ़ंक्शन और वैश्विक अस्थायी चर के साथ जाना पड़ा। लेकिन यह हर मामले में और 3.2 और बाश 4 में काम करता है

function set_temp_array()
{ # 1 - source_array_name $2-* default_values
  local default="$1"
  shift
  if declare -p $default >& /dev/null; then
    default="${default}[@]"
    TEMP_VAR=("${!default}")
  else
    TEMP_VAR=("${@}")
  fi
}

set_temp_array arr1 "${arr2[@]}"
arr1="${TEMP_VAR[@]}"

मैं मानों को कॉपी करने के लिए अप्रत्यक्ष सरणी संदर्भ का उपयोग करता हूं TEMP_VAR, लेकिन मैं एक अप्रत्यक्ष सरणी असाइनमेंट को bash में समझ नहीं सका, इसलिए दो लाइनें और अस्थायी चर

आप set -euप्रशंसकों के लिए वहाँ बाहर

function set_temp_array()
{ # 1 - source_array_name $2-* default_values
  local default="$1"
  shift
  if declare -p $default >& /dev/null; then
    default="${default}[@]"
    TEMP_VAR=(${!default+"${!default}"})
  else
    TEMP_VAR=(${@+"${@}"})
  fi
}

set_temp_array arr1 ${arr2+"${arr2[@]}"}
arr1=(${TEMP_VAR+"${TEMP_VAR[@]}"})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.