Cria uma matriz no bash com variáveis como nome da matriz

2

Eu não tenho certeza se isso foi respondido, eu olhei e não encontrei nada parecido com o que estou tentando fazer.

Eu tenho um número de scripts de shell que são capazes de rodar em um shell ksh ou bash, e eles fazem uso de arrays. Eu criei uma função chamada "setArray" que interroga o shell em execução e determina o que será usado para criar o array - para ksh, defina -A, para bash, typeset -a. No entanto, estou tendo alguns problemas com a parte bash.

A função recebe dois argumentos, o nome da matriz e o valor a ser adicionado. Isso se torna $ {ARRAY_NAME} e $ {VARIABLE_VALUE}. Fazendo o seguinte:

set -A $(eval echo \${ARRAY_NAME}) $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}"

funciona perfeitamente no ksh. No entanto,

typeset -a $(eval echo \${ARRAY_NAME})=( $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}" )

não. Isso fornece

bash: syntax error near unexpected token '('

Eu sei que posso apenas fazer uma lista de strings (por exemplo, MYARRAY="um dois três") e apenas percorrê-lo usando o IFS, mas também não quero perder a capacidade de usar um array. / p>

Alguma opinião?

    
por Kevin Huntly 10.03.2015 / 16:43

2 respostas

2

eval "$ARRAY_NAME"'+=("$VARIABLE_VALUE")'

(também funcionaria em zsh ou ksh93 ).

Seu ksh88 um deve ser:

eval 'set -A '"$ARRAY_NAME"' "${'"$ARRAY_NAME"'[@]}" "${VARIABLE_VALUE}"'
    
por 10.03.2015 / 17:32
0

Acho que o seguinte funciona no bash:

eval typeset -a $(eval echo \${ARRAY_NAME})=\( $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}" \)

As alterações que fiz são (1) prefixando eval e (2) escapando os parênteses que delimitam o array que construímos.

No entanto, o mesmo comando executado em ksh após a substituição de typeset -a por set -A falhará. Seria possível para você:

  • Livre-se de typeset / set inteiramente (acho que atribuir uma matriz à sua variável define implicitamente seu tipo) ou

  • altere seu código para que os dois bits do código específico do shell sejam totalmente separados?

Em ambos os casos, o snippet postado aqui parece frágil; talvez seja melhor usar apenas o operador de acréscimo += , que parece estar disponível no bash e no ksh.

    
por 10.03.2015 / 17:13