Não é possível usar uma variável de ambiente Array as

4

Eu não sei porque não posso usar a variável env array dentro de um script?
No meu ~/.bashrc ou ~/.profile

export HELLO="ee"
export HELLOO=(aaa bbbb ccc)

em um shell:

> echo $HELLO
ee
> echo $HELLOO
aaa
> echo ${HELLOO[@]}
aaa bbbb ccc

em um script:

#!/usr/bin/env bash
echo $HELLO
echo $HELLOO
echo ${HELLOO[@]}
---
# Return 
ee

Por quê?

    
por Mathieu Lescaudron 19.09.2017 / 05:46

2 respostas

10

Uma matriz bash não pode ser uma variável de ambiente, pois as variáveis de ambiente podem ser apenas pares de sequências de valores-chave.

Você pode fazer o que o shell faz com sua variável $PATH , que essencialmente é uma matriz de caminhos; transforma a matriz em uma string, delimitada por algum caractere específico que não esteja presente nos valores da matriz:

$ arr=( aa bb cc "some string" )
$ arr=$( printf '%s:' "${arr[@]}" )
$ printf '%s\n' "$arr"
aa:bb:cc:some string:

Ou mais puro,

arr=( aa bb cc "some string" )
arr=$( IFS=:; printf '%s' "${arr[*]}" )
export arr

A expansão de ${arr[*]} será os elementos da matriz arr separados pelo primeiro caractere de IFS , aqui definido como : . Note que, se o fizer desta forma, os elementos da string serão separados (não delimitados ) por : , o que significa que não seria capaz de distinguir uma elemento vazio no final, se houvesse um.

Uma alternativa para passar valores para um script usando variáveis de ambiente é (obviamente?) para usar os argumentos da linha de comando:

arr=( aa bb cc )

./some_script "${arr[@]}"

O script acessaria os argumentos transmitidos um por um usando os parâmetros posicionais $1 , $2 , $3 etc ou pelo uso de $@ :

printf 'First I got "%s"\n' "$1"
printf 'Then  I got "%s"\n' "$2"
printf 'Lastly there was "%s"\n' "$3"

for opt in "$@"; do
    printf 'I have "%s"\n' "$opt"
done
    
por 19.09.2017 / 06:36
3

Matrizes são bash específicas. Variáveis de ambiente são pares nome-valor.

Leia as especificações sobre variáveis de ambiente , que dizem, em parte:

The value of an environment variable is a string of characters. For a C-language program, an array of strings called the environment shall be made available when a process begins. The array is pointed to by the external variable environ, which is defined as:

extern char **environ;

These strings have the form name=value; names shall not contain the character '='.

    
por 19.09.2017 / 06:12