cómo usar cadenas en un archivo como variable

cómo usar cadenas en un archivo como variable

Tengo un contenido de archivo de configuración como el siguiente.

archivo.conf:

key name
value pswd

Ahora quiero escribir un script para tener las dos variables como se muestra arriba.

guión.sh

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

. /path/to/file.confMe está dando un error de comando de clave y valor no encontrado.

Respuesta1

intentar

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

Esta línea awk básicamente usa el primer archivo (cuando hay más de dos) como nombre de var, luego el resto de la línea como valor (de ahí el $1=""truco sucio).

Según la sugerencia de Terdon, el valor proporcionado no tiene espacio.

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

Respuesta2

Suponiendo que su shell es estilo Bourne, donde las variables se definen con var="value", con GNU sedpuede hacer:

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

O

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

O

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

Todos estos son básicamente la misma idea. Tanto en GNU sedcomo en perl, el -imodificador editará el archivo en su lugar y s/foo/bar/lo sustituirá foopor baren cada línea de entrada. Entonces, la primera sustitución reemplazará el primer espacio con ="y la segunda sustitución agregará una "al final de la línea ( $).

Todos estos convertirán esto:

key name
value pswd
key1 foo bar

A esto:

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

Respuesta3

Interpreté lo que querías de forma un poco diferente... es decir, que quieres una manera de obtener fuentes file.confcomo si fuera un conjunto de asignaciones de variables de shell, así que en lugar de

. /path/to/file.conf

intenta usar

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

Deberá asegurarse de que el formato de file.confno se desvíe de lo que ha descrito aquí.

Tenga en cuenta que estoy usando deliberadamente eval en toda la salida en lugar de llamar a eval en cada asignación dentro del bucle, porque no estoy seguro de si las asignaciones de variables serán globales allí (pueden realizarse en un subshell debido a la entrada redirigida). - ¿Alguien lo sabe con seguridad? Supongo que podría probarlo :-)

Respuesta4

Es posible que las comillas dobles no sean la mejor opción, ya que dentro de ellas, los caracteres $, ", barra invertida y comilla invertida siguen siendo especiales.

En su lugar, usaría comillas simples ( key='name'), ya que entonces el único carácter del que debe preocuparse es 'él mismo.

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

información relacionada