Avaliar o comando armazenado na variável de ambiente [duplicado]

0

Um script bash que eu tenho limitado ou nenhuma capacidade de modificar está usando uma variável de ambiente como:

"${SERVER_ADDRESS}"

O valor SERVER_ADDRESS real só pode ser determinado dinamicamente no tempo de execução, portanto, gostaria de definir SERVER_ADDRESS como um comando curl que procura o IP. Algo como:

SERVER_ADDRESS='curl -s http://lookup.api.com'

O que torna isso mais complicado é que a pesquisa real só retornará uma parte do endereço necessário, então o que eu realmente preciso é de algum tipo de concatenação:

SERVER_ADDRESS='$(curl -s http://lookup.api.com).restofaddress.com'

Isso significará que o comando curl será executado e avaliado quando a string for atribuída à variável de ambiente, no entanto, eu preciso que essa avaliação ocorra no script quando for executada.

Eu tentei todas as formas possíveis de formatar o texto nessa variável de ambiente para que o script com apenas "$ {SERVER_ADDRESS}" acabe com o valor correto, mas estou perplexo. Talvez isso simplesmente não seja possível sem adicionar um pouco mais de sofisticação ao script de recebimento.

    
por MWelch 12.12.2016 / 19:52

2 respostas

0

Use aspas duplas em vez de aspas simples:

SERVER_ADDRESS="$(curl -s http://lookup.api.com).restofaddress.com"

Interpolações e expansões (por exemplo, expansão de variável ou expansão de comando como é o caso aqui) são executadas dentro de strings de aspas duplas, mas não de strings entre aspas simples.

    
por 12.12.2016 / 19:55
0

Como diz o jayhendren, você deve usar aspas duplas quando quiser interpolar uma variável. Mas onde o nome da variável é imediatamente adjacente aos caracteres válidos do nome da variável, você precisa dizer ao bash onde o nome da variável começa e termina colocando o nome entre chaves. É muito difícil descobrir o que você quer dizer quando descreve seu problema em algo que parece código, mas não executa para dar o resultado desejado (ou produz um fqdn muito peculiar), mas acho que você deveria estar fazendo algo como ... ..

ADDR="http://lookup.api.com/"
export ADDR
...
curl -s -o "${OUTPUTFILE}" "${ADDR}some/path"

Ou você quer dizer que o URL que você realmente deseja recuperar é composto por um fragmento retornado pelo link ? Se este for o caso, você deve procurar um grande bastão e usá-lo para bater repetidamente na pessoa que escreveu a API e gritar "302! 302! 302!". Se eles são muito maiores do que você ou têm uma arma, você pode considerar o método sugerido pelo jayhedren, no entanto, embora elegantemente conciso, esta não é uma solução particularmente robusta. Considere, em vez disso:

FRAG='curl -s -o "${ADDR}some/path" | tr -d '0125''
curl -s -o "${OUTPUTFILE}" "${ADDR}some/path"
    
por 12.12.2016 / 20:55