Como faço para obter o valor de uma variável de um script e importá-lo em outro script?

1

Como faço para obter o valor de uma variável de um script e importá-lo em outro script? Mas o problema é que o script onde eu vou pegar o valor da variável também tem alguns comandos que eu não quero executar:

Digamos que isso seja script1.sh:

variable="Hello"
#some command here e.g. yum check-update

E em script2.sh:

echo $var

Eu encontrei uma abordagem onde um usa o comando EXPORT e coloca ./script1.sh dentro do script2.sh, mas ele executa os outros comandos.

Então, como posso obter o valor da variável sem executar os comandos dentro dela? Espero que esta pergunta seja clara. Obrigado antecipadamente!

    
por Miguel Roque 09.06.2014 / 04:27

2 respostas

4

Para resumir, você deseja recuperar um valor de script1.sh sem executar todos os comandos em script1.sh . Assumirei que script1.sh não está sob o seu controle, possivelmente porque é fornecido pelo fornecedor, ou gerenciado por um colega obstinado, ou semelhante, o que faz com que script1.sh tenha que ser usado como está.

Vou apresentar duas abordagens. O primeiro é bom para obter variáveis específicas de script1.sh , uma no momento:

var=$(awk -F'"' '/^variable=/ {print $2}' script1.sh )
echo $var

Isso usa awk para ler (não executar, apenas ler) script1.sh . awk procura a linha que começa com variable= e grava o que aparece depois da marca de aspas duplas nessa linha. A saída de awk é capturada na variável var .

Mais detalhadamente:

  • A instrução está no formato var=$(...) . Isso significa que o que estiver nos parênteses é executado como um comando bash e sua saída padrão é atribuída à variável var .

  • Dentro dos parênteses, temos o comando awk : awk -F'"' '/^variable=/ {print $2}' script1.sh . Vamos considerá-lo em partes.

  • awk divide as linhas (registros) em campos. -F'"' diz ao awk para usar aspas duplas como um separador de campo.

  • /^variable=/ diz awk para restringir a operação às linhas que começam com variable= . Assim, todos os comandos diversos em script1.sh serão ignorados.

  • {print $2} diz awk para imprimir o segundo campo. Isso significa o que quer que esteja entre a primeira e a segunda ocorrência de um caractere de aspas duplas.

  • O último argumento para awk informa qual arquivo deve ser lido: script1.sh .

A abordagem acima é boa para lidar com uma variável de cada vez e permite que você renomeie a variável se quiser.

Como lidar com muitas variáveis

Se você deseja obter todas as variáveis atribuídas em script1.sh , considere:

source <(grep -E '^\w+=' script1.sh)

Isso usa grep para extrair todas as linhas de script1.sh que se parecem com atribuições de variáveis. Essas linhas são então executadas no shell atual, atribuindo as variáveis.

Se você usar essa abordagem, primeiro verifique se deseja todas as variáveis e se não há nenhuma que interfira no que você está fazendo. Se houver, podemos excluí-los com um segundo comando grep .

Considerando as peças por vez:

  • source file diz ao shell para executar o file no shell atual.

  • <(...) é chamado de substituição de processo. Ele nos permite usar a saída de um comando no lugar de um nome de arquivo.

  • O comando grep -E '^\w+=' script1.sh extrai todas as linhas que parecem atribuições de variáveis. Se você executar este comando sozinho na linha de comando, verá algo como:

    variable="Hello"
    var2="Value2"
    

    e assim por diante. Você deve fazer isso primeiro e inspecionar a saída para ter certeza de que essas são as linhas que você deseja executar.

por 09.06.2014 / 04:38
4

Você deve fazer isso com três scripts:

cat ./script/init_vars.sh
    variable_1=value_1
    variable_2=value_2
    variable_3=value_3

cat ./script/module_1.sh
    . ./script/init_vars.sh
    printf %s\n "$variable_1"

cat ./script/module_2.sh
    . ./script/init_vars.sh
    printf %s\n "$variable_1"

Se seus arquivos se parecessem com ^ that ^ , você seria capaz de fazer isso muito mais facilmente - sem depender de expressões regulares. A execução de module_1.sh ou module_2.sh seria a saída:

value_1
    
por 09.06.2014 / 05:12