将局部变量的值设置为等于环境变量

时间:2020-06-15 20:21:21

标签: linux shell environment-variables

我有以下两个文件:

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。 如何分配环境变量值?

2 个答案:

答案 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不会放在此处文档中; catprint都应写入相同的输出文件。

printf 'MY_DATABASE=%q\n' "$MY_DATABASE" > conf/my-vars.conf
cat >> conf/my-vars.conf <<- "EOF"
SOME_OTHER_VAR="a different value"
EOF

更好的是,将printfcat都放在一个共享单个输出重定向的命令组中。

{
  printf 'MY_DATABASE=%q\n' "$MY_DATABASE"
  cat <<- "EOF"
SOME_OTHER_VAR="a different value"
EOF
} > conf/my-vars.conf