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

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

file.conf:

key name value pswd 

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

script.sh

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

. /path/to/file.conf . /path/to/file.conf дает мне команду key & value, не найденную ошибку.

пытаться

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

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

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

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

Предполагая, что ваша оболочка имеет стиль 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 и perl , ключ -i будет редактировать файл на месте, а s/foo/bar/ заменит foo на bar на каждой строке ввода. Итак, первая подстановка заменит 1-е пространство на « =" а вторая подстановка добавит " в конце строки ( $ ).

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

 key name value pswd key1 foo bar 

К этому:

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

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

 . /path/to/file.conf 

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

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

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

Обратите внимание, что я намеренно использую eval для всего вывода, а не вызываю eval для каждого присваивания внутри цикла, потому что я не уверен, что назначения переменных будут глобальными (они могут выполняться в под-оболочке из-за перенаправленного ввода – Кто-нибудь знает наверняка? Я полагаю, я мог бы просто проверить его 🙂

Двойные кавычки могут быть не лучшим выбором кавычек там, как внутри них, символы " , " , «обратная косая черта» и " обратный ход» по-прежнему являются особенными.

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

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