Écrire un tableau par défaut dans une variable dans Bash

10

je m'attendais à

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

être un tableau s'il $excludesest vide. Malheureusement, le contenu suivant :-est considéré comme une chaîne. Ai-je raté une contorsion de syntaxe, ou dois-je utiliser le maladroit

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

?

l0b0
la source

Réponses:

10

Vous pouvez construire un tableau à partir d'un autre tableau avec cette syntaxe:

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

Cela peut être traduit dans cette syntaxe de valeur par défaut:

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

J'ai testé certains cas de bord, comme des membres de tableau avec des espaces ou des retours à la ligne et il semble les gérer correctement.

GnP
la source
3
Si arr2 est vide, arr1 devient un tableau de longueur un avec une chaîne vide
Andy
2

Étant donné que j'avais des cas où mon arr2peut être vide, mais réglé, je n'ai pas pu trouver de solution simple. J'ai donc dû aller avec une fonction et une variable de température globale. Mais cela fonctionne dans tous les cas et dans bash 3.2 et 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[@]}"

J'utilise une référence de tableau indirect pour copier les valeurs TEMP_VAR, mais je n'ai pas pu comprendre une affectation de tableau indirect dans bash, d'où les deux lignes et la variable temp

Pour vous les set -eufans là-bas

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
la source