Запишіть масив за замовчуванням до змінної в 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може бути порожнім, але встановленим, я не зміг знайти просте рішення. Тому мені довелося перейти з функцією та глобальною змінною temp. Але це працює в кожному випадку і в 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, отже, два рядки та temp змінна

Для вас 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.