设置一个局部变量的值等于一个env变量。

问题描述 投票:0回答:1

我有以下两个文件。

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.如何分配env变量的值?

linux shell environment-variables
1个回答
2
投票

你可以用 here 文档标记周围的引号来控制扩展。

# Shows "Hello, $(whoami)"
cat << "EOF"
Hello, $(whoami)
EOF

# Shows "Hello, myuser"
cat << EOF
Hello, $(whoami)
EOF

所以只要取消引号 EOF 脚本中。


0
投票

为了正确地完成这个任务,你需要从你的shell中获得一些额外的支持。假设您使用的是 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
© www.soinside.com 2019 - 2024. All rights reserved.