Grava a matriz padrão na variável no Bash

10

eu estava esperando

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

para ser uma matriz se $excludesestiver vazia. Infelizmente, o material a seguir :-é considerado uma string. Perdi alguma contorção de sintaxe ou tenho que usar o desajeitado

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

?

l0b0
fonte

Respostas:

10

Você pode construir uma matriz a partir de outra matriz com esta sintaxe:

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

Isso pode ser traduzido para esta sintaxe de valor padrão:

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

Eu testei alguns casos extremos, como membros da matriz com espaços ou novas linhas e parece lidar com eles corretamente.

GnP
fonte
3
Se arr2 estiver vazio, arr1 se tornará um array de comprimento um com uma string vazia #
Andy
2

Como tive casos em que meu arr2pode estar vazio, mas definido, não consegui encontrar uma solução simples. Então eu tive que ir com uma função e uma variável global de temperatura. Mas funciona em todos os casos e no bash 3.2 e no 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[@]}"

Eu uso a referência indireta da matriz para copiar os valores TEMP_VAR, mas não consegui descobrir uma atribuição indireta da matriz no bash, portanto, as duas linhas e a variável temp

Para vocês set -eufãs por aí

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
fonte