Napisz domyślną tablicę do zmiennej w Bash

10

Spodziewałem się

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

być tablicą, jeśli $excludesjest pusta. Niestety, rzeczy później :-są traktowane jako ciąg znaków. Czy tęskniłem za zniekształceniem składni, czy też muszę używać niezgrabnego

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

?

l0b0
źródło

Odpowiedzi:

10

Możesz zbudować tablicę z innej tablicy za pomocą tej składni:

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

Można to przełożyć na tę składnię wartości domyślnych:

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

Przetestowałem niektóre przypadki krawędzi, takie jak elementy tablicy ze spacjami lub znakami nowej linii i wydaje się, że poprawnie je obsługują.

GnP
źródło
3
Jeśli arr2 jest pusty, arr1 staje się tablicą o długości jeden z jednym pustym ciągiem
Andy
2

Ponieważ miałem przypadki, w których mój arr2może być pusty, ale ustawiony, nie mogłem znaleźć prostego rozwiązania. Musiałem więc użyć funkcji i globalnej zmiennej temp. Ale działa w każdym przypadku oraz w bash 3.2 i bash 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[@]}"

Używam pośredniego odwołania do tablicy, aby skopiować wartości TEMP_VAR, ale nie mogłem znaleźć pośredniego przypisania tablicy w bash, stąd dwie linie i zmienna temp

Dla was, set -eufanów tam

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[@]}"})
Andy
źródło