如何使用文件中的字符串作为变量

如何使用文件中的字符串作为变量

我有一个如下所示的conf文件内容。

文件.conf:

key name
value pswd

现在我想编写一个脚本来包含上面的两个变量

脚本文件

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 行基本上使用第一个字段(当超过两个时)作为 var 名称,然后使用其余行作为值(因此是$1=""肮脏的技巧)。

根据 Terdon 的建议,提供的值中没有空间。

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

答案2

假设你的 shell 是 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

这些基本上都是同一个想法。在 GNUsed和中perl-i开关将就地编辑文件并在每个输入行上s/foo/bar/替换。因此,第一次替换将替换第一个空格,第二次替换将在行尾添加一个 ( )。foobar=""$

所有这些都会将其转换为:

key name
value pswd
key1 foo bar

对此:

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

答案3

我对你想要的东西的解释有点不同......即你想要一种源方式,file.conf就好像它是一组 shell 变量赋值一样 - 所以而不是

. /path/to/file.conf

尝试使用

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

您需要确保 的格式file.conf没有偏离您在此处描述的格式。

请注意,我故意在整个输出上使用 eval,而不是在循环内的每个赋值上调用 eval,因为我不确定变量赋值是否是全局的(由于重定向的输入,它们可能在子 shell 中完成) - 有人确定吗?我想我可以测试一下:-)

答案4

双引号可能不是引号的最佳选择,因为在双引号内,$"、 反斜杠和反引号字符仍然很特殊。

我会使用单引号字符 ( key='name') 来代替,因为这样您唯一需要担心的字符就是'它本身。

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

相关内容