Scrivi l'array predefinito nella variabile in Bash


10

stavo aspettando

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

essere un array se $excludesè vuoto. Sfortunatamente la roba dopo :-è considerata una stringa. Ho perso qualche contorsione della sintassi o devo usare il grosso

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

?

Risposte:


10

È possibile costruire un array da un altro array con questa sintassi:

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

Che può essere tradotto in questa sintassi del valore predefinito:

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

Ho testato alcuni casi limite, come i membri dell'array con spazi o newline in essi e sembra gestirli correttamente.


3
Se arr2 è un vuoto, arr1 diventa un array di lunghezza uno con una stringa vuota
Andy,

2

Dato che ho avuto casi in cui il mio arr2potrebbe essere vuoto, ma impostato, non sono riuscito a trovare una soluzione semplice. Quindi ho dovuto scegliere una funzione e una variabile temp globale. Ma funziona in ogni caso e in bash 3.2 e 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[@]}"

Uso il riferimento di matrice indiretto per copiare i valori TEMP_VAR, ma non sono riuscito a capire un'assegnazione di matrice indiretta in bash, quindi le due righe e la variabile temp

Per voi set -eufan là fuori

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[@]}"})
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.