Bash'de varsayılan diziyi değişkene yazma


10

bekliyordum

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

$excludesboşsa dizi olmak . Ne yazık ki sonraki şeyler :-bir dize olarak alınır. Bazı sözdizimi bükülmesini mi kaçırdım, yoksa tıknazlığı kullanmak zorunda mıyım

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

?

Yanıtlar:


10

Bu sözdizimiyle başka bir diziden bir dizi oluşturabilirsiniz:

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

Bu, bu varsayılan değer sözdizimine çevrilebilir:

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

İçlerinde boşluk veya satırsonu olan dizi üyeleri gibi bazı kenar durumlarını test ettim ve bunları doğru şekilde ele alıyor gibi görünüyor.


3
Eğer arr2 boşsa, arr1 bir boş dizeyle bir uzunluk dizisi haline gelir
Andy

2

arr2Boş olabileceğim, ancak ayarlayabileceğim durumlar olduğu için basit bir çözüm bulamadım. Bu yüzden bir işlev ve küresel sıcaklık değişkeni ile gitmek zorunda kaldım. Ancak her durumda ve bash 3.2 ve bash 4'te çalışır

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[@]}"

Ben değerleri kopyalamak için dolaylı dizi başvurusu kullanın TEMP_VAR, ancak bash dolaylı bir dizi ataması anlayamadık, bu nedenle iki satır ve temp değişkeni

Eğer için set -euorada fanlar

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[@]}"})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.