como usar strings em um arquivo como uma variável

0

Eu tenho um conteúdo de arquivo conf como abaixo.

file.conf:

key name
value pswd

Agora eu quero escrever um script para ter as duas variáveis como acima

script.sh

key="name"      #key as variable
value="pswd"    #value as variable

. /path/to/file.conf está me dando as chaves & comando de valor não encontrado erro.

    
por unix311 08.11.2015 / 10:56

4 respostas

2

tente

 awk 'NF>1 { var=$1 ; $1 = "" ; printf "%s=\"%s\"\n",var,$0; }' file.conf > script.sh

essa linha do awk basicamente usa o primeiro arquivo (quando mais de dois) como nome do var, e o restante da linha como valor (daí o truque $1="" sujo).

De acordo com a sugestão de Terdon, o valor fornecido não tem espaço.

 awk '{print $1 "=" $2 }' file.conf > script.sh
    
por 08.11.2015 / 11:31
2

Assumindo que seu shell é estilo bourne, onde variáveis são definidas com var="value" , com GNU sed , você pode fazer:

sed -i 's/ /="/;s/$/"/' file.conf

Ou

sed -i -e 's/ /="/' -e 's/$/"/' file.conf

Ou

perl -i -pe 's/ /="/;s/$/"/' file.conf

Tudo isso é basicamente a mesma ideia. Em ambos os GNU sed e perl , a opção -i editará o arquivo no local e s/foo/bar/ substituirá foo por bar em cada linha de entrada. Portanto, a primeira substituição substituirá o primeiro espaço por =" e a segunda substituição adicionará " ao final da linha ( $ ).

Tudo isso irá converter isso:

key name
value pswd
key1 foo bar

Para isso:

key="name"
value="pswd"
key1="foo bar"
    
por 08.11.2015 / 12:31
0

Eu interpretei o que você queria de forma um pouco diferente ... ou seja, você deseja uma maneira de gerar file.conf como se fosse um conjunto de atribuições de variáveis de shell - então, em vez de

. /path/to/file.conf

tente usar

eval 'while read var val; do echo "${var}='${val}'"; done < /path/to/file.conf'

Você precisa ter certeza de que o formato de file.conf não se desviou do que você descreveu aqui.

Note que estou deliberadamente usando eval em toda a saída em vez de chamar eval em cada atribuição dentro do loop, porque não tenho certeza se as atribuições de variáveis serão globais lá (elas podem ser feitas em uma sub-shell por causa de a entrada redirecionada - alguém sabe ao certo? Eu suponho que eu poderia apenas testá-lo: -)

    
por 08.11.2015 / 14:09
0

As aspas duplas podem não ser a melhor escolha entre aspas, pois os caracteres $ , " , backslash e backtick ainda são especiais.

Eu usaria caracteres de aspas simples ( key='name' ) como o único caractere com o qual você precisa se preocupar é ' .

sed "s/'/'\\''/g;s/ /='/;s/\$/'/" < file.conf > file.sh
    
por 08.11.2015 / 17:34