Importar variáveis de outro arquivo

1

Eu tenho um arquivo de script:

#!/usr/bin/env bash

. /home/$USER/git_projects/cfhookbash/config.txt

deploy_challenge() {
}

No config.txt existe www.example.com_token="asdfasdf"

Eu preciso imprimir (ou reutilizar) o valor de www.example.com_token , no meu exemplo asdfasdf .

Eu recebo /home/sineverba/git_projects/cfhookbash/config.txt: line 1: www.k2p.it_token=asdfasdf: command not found

    
por sineverba 11.06.2018 / 22:11

2 respostas

6

Em bash , os nomes de variáveis só podem ser feitos com caracteres alfanuméricos de um byte ou sublinhados (e o primeiro caractere não pode ser um dígito).

Portanto, www.example.com_token não é um nome de variável válido, www.example.com_token="asdfasdf" não é reconhecido como uma atribuição, mas como um comando simples.

Em ksh93 (o shell bash tenta emular), www.example.com_token="asdfasdf" só funcionaria se você definisse a variável www como uma variável composta :

$ compound www
$ www.example.com_token="asdfasdf"
$ typeset -p www
typeset -C www=(example=(com_token=asdfasdf))
$ printf '%s\n' "${www.example.com_token}"
asdfasdf

Em bash , você poderia usar uma variável de matriz associativa (um desses recursos ksh93 copiados por bash ):

typeset -A token
token[www.example.com]=asdfasdf
printf '%s\n' "${token[www.example.com]}"

(essa sintaxe também deve funcionar em ksh93 e zsh ).

Se você não puder modificar esse config.txt para que seja compatível com a sintaxe do seu shell, você poderá editá-lo imediatamente antes de avaliar. Curtir (com ksh93 , bash ou zsh ):

typeset -A token
. <(sed 's/^\([^=]*\)_token=/token[]=/' < config.txt)

Para transformar o x.y_token= em token[x.y]= ou:

. <(sed -e :1 -e 's/^\([^=]*\)\.\(.*=\)/_/; t1' < config.txt)

Para substituir todos os . restantes do = por _ .

Mas cuidado, pois qualquer um pode fazer substituições em locais onde não é esperado, como em:

foo.bar_token="multi
line .x. _token assignment (=)"

Ou se o arquivo não contiver apenas atribuições.

Agora, se o config.txt não tiver a sintaxe de shell adequada, você deve procurar outros problemas de sintaxe, como linhas contendo foo="price: $12" ou foo="x 'y' z" , em que $ , ' são operadores especiais em a sintaxe da shell.

    
por 11.06.2018 / 22:47
2

Como comentei, você não pode simplesmente fornecer esse arquivo txt, porque não é um script de shell válido.

Para obter esse valor particular , tente

config=/home/$USER/git_projects/cfhookbash/config.txt
token=$( grep -oP 'www.example.com_token="\K[^"]+' "$config" )
    
por 11.06.2018 / 22:49