Eu tenho a seguinte variável de arquivo e valores
# more file.txt
export worker01="sdg sdh sdi sdj sdk"
export worker02="sdg sdh sdi sdj sdm"
export worker03="sdg sdh sdi sdj sdf"
Eu executo source para ler a variável
# source file.txt
exemplo:
echo $worker01
sdg sdh sdi sdj sdk
até agora tudo é perfeito
mas agora eu quero ler as variáveis do arquivo e imprimir os valores por simples loop bash vou ler o segundo campo e tentar imprimir o valor da variável
# for i in ` sed s'/=/ /g' /tmp/file.txt | awk '{print $2}' `
do
echo $i
declare var="$i"
echo $var
done
mas imprime apenas a variável e não os valores
worker01
worker01
worker02
worker02
worker03
worker03
saída esperada:
worker01
sdg sdh sdi sdj sdk
worker02
sdg sdh sdi sdj sdm
worker03
sdg sdh sdi sdj sdf
Você tem
export worker01="sdg sdh sdi sdj sdk"
, então você substitui=
por um espaço para obterexport worker01 "sdg sdh sdi sdj sdk"
. Os campos separados por espaço sãoexport
,worker01
,"sdg
,sdh
, etc.Provavelmente é melhor dividir
=
e remover as aspas, portanto, apenas com o shell:key
contém o nome da variável,val
o valor. É claro que isso não analisa realmente a entrada, apenas remove as aspas duplas, se elas estiverem lá.Com awk sozinho:
para fazer um loop você pode:
Se você também deseja imprimir o nome da variável em seu loop, pode fazer isso:
Resultado:
Primeiro, você pode obter os nomes das variáveis com este comando GNU grep, usando um regex compatível com Perl:
Em seguida, você pode ler a saída disso em uma matriz bash com:
mapfile
Isso usa o comando interno bash e uma substituição de processo .Por último, repita os nomes das variáveis e use a expansão indireta de parâmetros para obter os valores:
Você pode usar este sed
Ou isso é estranho