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ávelvar
. -
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=/
dizawk
para restringir a operação às linhas que começam comvariable=
. Assim, todos os comandos diversos emscript1.sh
serão ignorados. -
{print $2}
dizawk
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 ofile
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.