我有以下两个文件:
1)env-vars.sh
export MY_DATABASE=postgres
2)my-test.sh
#!/bin/bash
. $(pwd)/env-vars.sh
echo $MY_DATABASE
cat > $(pwd)/conf/my-vars.conf <<- "EOF"
MY_DATABASE=$MY_DATABASE
EOF
现在,我的第二个脚本正在正确地回显env-vars.sh文件中的env变量,甚至创建了my-vars.conf文件,但是该文件的内容如下:
MY_DATABASE=$MY_DATABASE
我希望文件my-vars.conf具有变量MY_DATABASE的值作为postgres。 如何分配环境变量值?
答案 0 :(得分:2)
您可以使用此处文档标记周围的引号控制扩展:
# Shows "Hello, $(whoami)"
cat << "EOF"
Hello, $(whoami)
EOF
# Shows "Hello, myuser"
cat << EOF
Hello, $(whoami)
EOF
因此只需在脚本中取消引用EOF
。
答案 1 :(得分:0)
要正确执行此操作,您需要外壳程序提供一些额外的支持。假设您正在使用bash
,则应使用以下内容:
printf 'MY_DATABASE=%q\n' "$MY_DATABASE" >> conf/my-vars.conf
为此,您需要%q
的原因是要防止MY_DATABASE
的值,该值不允许简单插值来产生可重现该值的代码。一些例子:
$ MY_DATABASE="foo bar"
$ printf 'MY_DATABASE=%s\n' "$MY_DATABASE"
MY_DATABASE=foo bar
$ printf 'MY_DATABASE=%q\n' "$MY_DATABASE"
MY_DATABASE=foo\ bar
这可能会使您认为您可以在输出中添加引号。不对。
$ MY_DATABASE='foo" bar'
$ printf 'MY_DATABASE="%s"\n' "$MY_DATABASE"
MY_DATABASE="foo" bar"
$ printf 'MY_DATABASE=%q\n' "$MY_DATABASE"
MY_DATABASE=foo\"\ bar
写出不会产生不良输出的代码比写出依赖于格式正确的输入的简单代码更好。
如果您需要将printf
与附加的cat
命令结合使用,则printf
不会放在此处文档中; cat
和print
都应写入相同的输出文件。
printf 'MY_DATABASE=%q\n' "$MY_DATABASE" > conf/my-vars.conf
cat >> conf/my-vars.conf <<- "EOF"
SOME_OTHER_VAR="a different value"
EOF
更好的是,将printf
和cat
都放在一个共享单个输出重定向的命令组中。
{
printf 'MY_DATABASE=%q\n' "$MY_DATABASE"
cat <<- "EOF"
SOME_OTHER_VAR="a different value"
EOF
} > conf/my-vars.conf