Definir uma variável cujo valor depende de outra variável

2

Eu tenho um arquivo de texto variables.txt onde eu armazeno minhas variáveis

host=/srv/www/vhosts/hosting

index=$host/index.php

como você vê, a segunda variável depende da primeira.

Eu também tenho um arquivo de script para carregar essas variáveis

f=~/variables.txt
for line in $(cat $f)
do
export $line
done

quando executo o arquivo de script, minha primeira variável é carregada, enquanto a segunda não:

bash: $host/index.php: No such file or directory

é porque depois de carregar a primeira variável host , ela não se lembra do valor a ser usado para definir a segunda variável index .

Então, como resolver esse problema? Eu acho que deve haver algumas opções adicionais ou parâmetros para passar para fazer isso ( export ?) Lembrar o valor da variável set em um loop for .

    
por easl 23.07.2013 / 09:31

4 respostas

3

A principal coisa a notar é que você provavelmente não precisa exportar essas variáveis; essa necessidade é reservada somente quando um subprocesso está consultando seu ambiente herdado para uma variável. Normalmente, as pessoas estão exportando uma variável e fazendo algo como somecmd "$myexportedvar" . Seu shell está expandindo $myexportedvar antes que somecmd o veja.

Se você realmente precisar exportá-los para um subprocesso extrair do ambiente:

while IFS= read -r line; do
  if [[ $line == *=* && $line != #* ]]; then
    IFS== read -r var val <<<"$line"
    printf -v "$var" '%s' "$val"
    export "$var"
  fi
done < "$HOME/variables.txt"

esse loop verifica se a linha é uma atribuição (meio) e se o primeiro caractere não é um hash de comentário. torna o esforço um pouco mais robusto, mas apenas mal. veja as duas opções abaixo, para lidar com isso com mais cuidado.

como um aparte, o loop acima garantirá que você não esteja executando o arquivo conforme ele é analisado. source avalia cada linha e realmente executa todas elas, então meu loop eliminará esse "problema" (se você considerar um problema).

Como alternativa, basta exportar as vars no arquivo original, em seguida, source "$HOME/variables.txt" e o trabalho já está pronto.

você pode querer usar apenas set -a; . "$HOME"/variables.txt; set +a . isso evita um problema em que o arquivo originado não consiste somente de atribuições. o loop de análise acima pode resultar em falsos positivos. leia help set para entender o que está fazendo.

Além disso, Não leia as linhas com e Usar mais cotações

    
por 23.07.2013 / 20:26
2

você tem uma maneira mais fácil de realizar isso.

cat vars
host=/srv/www/vhosts/hosting
index=$host/index.php

meu script de teste:

#!/bin/bash
. ./vars
echo $host
echo $index

Execução

./printvars.sh
/srv/www/vhosts/hosting
/srv/www/vhosts/hosting/index.php

Basicamente o. ./vars executa os arquivos e carrega as variáveis.

    
por 23.07.2013 / 09:38
1

Meu conselho também seria a fonte do arquivo e exportar tudo dentro do arquivo "variables.txt". Um editor de texto moderno deve permitir a "edição de colunas", ou você pode fazer o script da modificação.

No entanto, consegui responder à sua pergunta com este script:

#!/bin/sh

f=./variables.txt
source ${f}
for vname in $(cut -f1 -d'=' ${f})
do
    export ${vname}
done

A diferença é que eu fonte o arquivo variables.txt primeiro para que todas as variáveis sejam definidas no escopo deste shell com uma interpretação correta. Só então eu exporto todas as variáveis do arquivo, obtendo apenas o nome da variável (vname).

Em uma nota lateral, você deve proteger suas variáveis com $ {}.

    
por 23.07.2013 / 10:12
0

Você pode fazer isso em duas etapas:

. ./vars
while read line; do
    export $(printf "%s" "$line" | grep = | cut -d= -f 1)
done < vars

ou apenas um

while read line; do
   eval export "$line"
done < vars
    
por 23.07.2013 / 09:53