como usar strings em um arquivo como uma variável

como usar strings em um arquivo como uma variável

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

arquivo.conf:

key name
value pswd

Agora 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.confestá me dando um erro de comando de chave e valor não encontrado.

Responder1

tentar

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

esta linha awk basicamente usa primeiro o campo (quando mais de dois) como nome da var, depois o restante da linha como valor (daí o $1=""truque sujo).

De acordo com a sugestão de Terdon, desde que o valor não tenha espaço.

 awk '{print $1 "=" $2 }' file.conf > script.sh

Responder2

Supondo que seu shell seja do estilo bourne, onde as 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. Tanto no GNU quanto sedno perl, a -iopção editará o arquivo no local e s/foo/bar/substituirá foopor barem cada linha de entrada. Assim, a primeira substituição substituirá o 1º espaço por ="e a segunda substituição adicionará um "no final da linha ( $).

Tudo isso irá converter isso:

key name
value pswd
key1 foo bar

Para isso:

key="name"
value="pswd"
key1="foo bar"

Responder3

Eu interpretei o que você queria de uma forma um pouco diferente... ou seja, que você quer uma forma de fonte file.confcomo 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ê precisaria ter certeza de que o formato file.confnão se desviava do descrito aqui.

Observe que estou usando eval deliberadamente 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 um sub-shell por causa da entrada redirecionada - alguém sabe com certeza? Suponho que poderia testá-lo :-)

Responder4

As aspas duplas podem não ser a melhor escolha, pois dentro delas os caracteres $, ", barra invertida e crase ainda são especiais.

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

sed "s/'/'\\\\''/g;s/ /='/;s/\$/'/" < file.conf > file.sh

informação relacionada