Escribir matriz predeterminada en variable en Bash


10

Yo estaba esperando

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

ser una matriz si $excludesestá vacía. Lamentablemente, las cosas posteriores :-se consideran cadenas. ¿Me perdí alguna contorsión de sintaxis, o tengo que usar el torpe

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

?

Respuestas:


10

Puede construir una matriz a partir de otra matriz con esta sintaxis:

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

Eso se puede traducir a esta sintaxis de valor predeterminado:

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

He probado algunos casos extremos, como miembros de matriz con espacios o nuevas líneas en ellos y parece que los maneja correctamente.


3
Si arr2 es un vacío, arr1 se convierte en una matriz de longitud uno con una cadena vacía
Andy

2

Como tenía casos en los que mi arr2vacío podría estar vacío, pero configurado, no pude encontrar una solución simple. Así que tuve que ir con una función y una variable temporal global. Pero funciona en todos los casos y en bash 3.2 y 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[@]}"

Utilizo una referencia de matriz indirecta para copiar los valores TEMP_VAR, pero no pude entender una asignación de matriz indirecta en bash, por lo tanto, las dos líneas y la variable temporal

Para ustedes set -eufanáticos por ahí

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[@]}"})
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.