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.