
У меня есть файл 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
и perl
switch -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