Schreiben Sie ein Standardarray in eine Variable in Bash

10

ich habe erwartet

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

ein Array sein, wenn $excludeses leer ist. Leider wird das Zeug danach :-als String angesehen. Habe ich eine Syntaxverzerrung verpasst oder muss ich die klobige verwenden?

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

?

l0b0
quelle

Antworten:

10

Mit dieser Syntax können Sie ein Array aus einem anderen Array erstellen:

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

Das kann in diese Standardwertsyntax übersetzt werden:

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

Ich habe einige Randfälle getestet, z. B. Array-Elemente mit Leerzeichen oder Zeilenumbrüchen, und es scheint, als würden sie korrekt behandelt.

GnP
quelle
3
Wenn arr2 leer ist, wird arr1 zu einem Array der Länge eins mit einer leeren Zeichenfolge
Andy
2

Da ich Fälle hatte, in denen meine arr2möglicherweise leer, aber festgelegt waren, konnte ich keine einfache Lösung finden. Also musste ich mich für eine Funktion und eine globale temporäre Variable entscheiden. Aber es funktioniert in jedem Fall und in Bash 3.2 und 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[@]}"

Ich verwende eine indirekte Array-Referenz, um die Werte zu kopieren TEMP_VAR, aber ich konnte keine indirekte Array-Zuweisung in bash herausfinden, daher die beiden Zeilen und die temporäre Variable

Für euch set -euFans da draußen

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
quelle