Grave matriz padrão para variável no Bash

8

Eu estava esperando

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

para ser um array se $excludes estiver vazio. Infelizmente, o material depois de :- é considerado uma string. Eu senti falta de alguma contorção de sintaxe, ou eu tenho que usar o desajeitado

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

?

    
por l0b0 08.04.2011 / 14:03

2 respostas

7

Você pode construir um array a partir de outro array com esta sintaxe:

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

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

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

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

    
por 13.04.2015 / 16:55
2

Como tive casos em que o arr2 pode 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 temp global. Mas funciona em todos os casos e no bash 3.2 e 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 referência de matriz indireta para copiar os valores para TEMP_VAR , mas não consegui descobrir uma atribuição de matriz indireta no bash, daí as duas linhas e a variável temp

Para você, set -eu fã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[@]}"})
    
por 18.10.2016 / 01:24

Tags