как использовать строки в файле в качестве переменной

как использовать строки в файле в качестве переменной

У меня есть файл conf с таким содержимым.

файл.conf:

key name
value pswd

Теперь я хочу написать скрипт, который будет иметь две переменные, как указано выше.

скрипт.sh

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

. /path/to/file.confвыдает мне ошибку «Команда «ключ и значение» не найдена».

решение1

пытаться

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

эта строка awk в основном использует первое поле (если их больше двух) как имя переменной, а затем оставшуюся часть строки как значение (отсюда и $1=""грязный трюк).

Согласно предложению Тердона, в указанном значении не должно быть пробелов.

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

решение2

Предполагая, что ваша оболочка работает в стиле Bourne, где переменные определяются с помощью var="value", с помощью GNU sedвы можете сделать следующее:

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

Или

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

Или

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

Все это в основном одна и та же идея. В GNU sedи perlswitch -iотредактирует файл на месте и s/foo/bar/заменит fooна barв каждой строке ввода. Таким образом, первая замена заменит первый пробел на , ="а вторая замена добавит a "в конце строки ( $).

Все это преобразует это:

key name
value pswd
key1 foo bar

К этому:

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

решение3

Я интерпретировал то, что вы хотели, немного по-другому... то есть, вам нужен способ получить источник, file.confкак если бы это был набор назначений переменных оболочки - поэтому вместо

. /path/to/file.conf

попробуйте использовать

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

Вам необходимо убедиться, что формат file.confне отличается от того, что вы здесь описали.

Обратите внимание, что я намеренно использую eval для всего вывода, а не вызываю eval для каждого присваивания внутри цикла, поскольку не уверен, будут ли там глобальными присваивания переменных (они могут выполняться в подоболочке из-за перенаправленного ввода — кто-нибудь знает наверняка? Полагаю, я мог бы просто проверить это :-)

решение4

Двойные кавычки, возможно, не лучший выбор, поскольку внутри них символы $, ", обратная косая черта и обратный апостроф по-прежнему являются специальными.

Вместо этого я бы использовал одинарные кавычки ( key='name'), поскольку тогда единственный символ, о котором вам нужно беспокоиться, — это 'он сам.

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

Связанный контент