Записать массив по умолчанию в переменную в Bash


10

я ожидал

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

быть массивом, если $excludesон пуст. К сожалению, материал после :-принимается за строку. Я пропустил некоторые искажения синтаксиса, или я должен использовать неуклюжий

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

?

Ответы:


10

Вы можете создать массив из другого массива с помощью следующего синтаксиса:

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

Это может быть переведено в этот синтаксис значения по умолчанию:

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

Я протестировал некоторые крайние случаи, такие как элементы массива с пробелами или символами новой строки в них, и кажется, что они обрабатываются правильно.


3
Если arr2 является пустым, arr1 становится массивом длиной один с одной пустой строкой
Энди

2

Поскольку у меня были случаи, когда мой arr2мог быть пустым, но установленным, я не мог найти простое решение. Поэтому мне пришлось пойти с функцией и глобальной временной переменной. Но это работает в любом случае и в Bash 3.2 и 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[@]}"

Я использую косвенную ссылку на массив, чтобы скопировать значения TEMP_VAR, но я не смог выяснить косвенное присвоение массива в bash, отсюда две строки и временная переменная

Для вас set -euфанатов там

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[@]}"})
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.