我有一个如下所示的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/
替换。因此,第一次替换将替换第一个空格,第二次替换将在行尾添加一个 ( )。foo
bar
="
"
$
所有这些都会将其转换为:
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