export de variáveis não está funcionando no bash

1

o código abaixo não está funcionando em bash onde como está trabalhando sh tentei muitas soluções alternativas como colocar durante a leitura do pipe, mas não funcionou. As variáveis não estão sendo exportadas. Alguém pode sugerir o que precisa ser feito

 function() {
 RECORD = $1
 echo "$RECORD"|read var1 var 2 var3
 var1='echo $var1'
 var2 ='echo $var2'
 var3='echo $var3'
 export var1 var2 var3
 }
 ....
 while read EACH_RECORD
 do
 function "EACH_RECORD"
 *action on fecthed variables*
    
por divya 02.11.2015 / 07:32

1 resposta

4

Existem vários erros aqui. Deixe-me passar por eles em ordem:

RECORD = $1

Espaços não são permitidos em torno do = nas atribuições do shell, portanto, essa (e várias atribuições posteriores) não funcionará. O que isso realmente faz é tentar executar um comando chamado RECORD com "=" e o valor de $1 como argumentos. Nos espaços da casca são muito significativos; na maioria dos lugares eles são completamente necessários ou completamente proibidos. Até você aprender onde eles são opcionais, tenha muito cuidado em copiar os espaços exatamente de qualquer exemplo que você esteja trabalhando.

echo "$RECORD"|read var1 var 2 var3

Elementos de um pipeline (como o comando read aqui) são executados em subshells, o que significa que as atribuições de variáveis feitas neles acontecem na subshell ... e são perdidas quando a sub-shell sai. Além disso, você não pode ter um espaço no meio de um nome de variável ( var 2 ).

Você pode fazer isso sem o pipe assim:

read var1 var2 var3 <<<"$RECORD"

(Embora note que <<< é um bashismo, e não está disponível em todos os shells. Certifique-se de iniciar seu script com #!/bin/bash NOT #!/bin/sh .)

 var1='echo $var1'
 var2 ='echo $var2'
 var3='echo $var3'

Mesmo depois de remover o espaço perdido da segunda linha, isso não faz nada útil. Eles pegam os valores das variáveis, fazem eco, capturam a saída dos comandos de eco e os colocam de volta nas variáveis. Existem algumas mudanças que podem acontecer ao longo do caminho (como expansão de curingas), mas tenho certeza de que elas não são coisas que você quer que aconteçam. (Na verdade, você quase sempre deve colocar referências de variáveis entre aspas duplas para evitar coisas como expansão inesperada de caracteres curingas e divisão de palavras.) Portanto, apenas perca essas.

export var1 var2 var3

export diz ao shell para exportar o valor dessas variáveis para os comandos que você executa a partir desse shell - isto é, eles são exportados para baixo na hierarquia de processos, não para cima para o que correu isso. Mas, neste caso, a função está sendo executada no mesmo processo que a parte principal do script, portanto não há necessidade de importar para compartilhar variáveis em qualquer direção. Contanto que as variáveis não sejam declaradas local , elas estarão automaticamente disponíveis para o restante do script. Então, perca isso também.

(Note que não há como exportar variáveis para cima na hierarquia do processo. O que acontece em um subshell ou outro subprocesso permanece nesse subprocesso.)

 function "EACH_RECORD"

Você precisa de um $ na frente de EACH_RECORD ou ele será transmitido como uma string literal.

BTW, recomendo vivamente a execução dos seus scripts através do shellcheck.net - apontará muitos erros básicos antes de o colocarem problema.

    
por 02.11.2015 / 09:26

Tags