.env 文件中什么时候需要引号?
When are quotes needed in .env file?
例如,Symfony's configuring-environment-variables-in-env-files documents提供示例:
DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name"
DB_USER=root
为什么第一个示例而不是第二个示例使用引号(又名括号)?
如果适用的答案取决于解析 .env 文件的应用程序,请以 Symfony 为基础。
TL;DR解决方案: 当字符串中包含space或某些特殊字符和某些语法时,使用引号。其中包括:
space等白space,
反斜杠(转义 space 和换行符 – \
即使在未加引号的字符串中也会给出 space),
引号(但可以组合多个引号mark\ 'styles like'"this"
),
井号 (#
) 标记注释的开始(如果它不在引号字符串或 $(…)
中),
美元符号(用于扩展变量 – 见下文),
括号((
和 )
)——取决于上下文,
shell 重定向字符(>
、<
、2>
、|
等),
星号(*
)和问号(?
),因为它在 globs 中使用,
方括号(因为它们列出字符),
comma-separated {…}
中的文本(因为它提供了多种文本变体 – {foo,bar}baz
扩展为 foobaz barbaz
),
也许还有其他人,
当然还有换行符。
根据 the page linked by you,.env
文件是常规 bash
脚本。这意味着:
一个字符串不能包含多个单词(space-separated 部分),除非用引号括起来。¹
FOO_VAR='multiple words' # This works.
ANOTHER_VAR="foo bar" # This works, too.
BAR_VAR=this does not work # Executes “does” with args
# “not work” and variable
# BAR_VAR=“this”.
如果文本被双引号括起来或没有被任何引号括起来,则执行变量扩展。
my_var=42
VARIABLES="foo ${my_var}" # Gives “foo 42”.
可以执行 Shell 命令来生成字符串。²
CURRENT_DATE="$(date)" # Executes “date” and uses its
# stdout as the value.
DO_NOT_DO_THIS=$(date) # First expands the command, and we
# then get multiple unquoted words.
AVOID_THIS="`date`" # Non-standard syntax, accepted by bash.
¹ 在另一种情况下,它将 运行 第二个和所有后面的“单词”作为具有给定变量的 shell 命令。请参阅 bash(1)
联机帮助页。
² 根据文档,Microsoft Windows 不支持它。它没有说明 Windows.
上的变量扩展语法
例如,Symfony's configuring-environment-variables-in-env-files documents提供示例:
DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name"
DB_USER=root
为什么第一个示例而不是第二个示例使用引号(又名括号)?
如果适用的答案取决于解析 .env 文件的应用程序,请以 Symfony 为基础。
TL;DR解决方案: 当字符串中包含space或某些特殊字符和某些语法时,使用引号。其中包括:
space等白space,
反斜杠(转义 space 和换行符 –
\
即使在未加引号的字符串中也会给出 space),引号(但可以组合多个引号
mark\ 'styles like'"this"
),井号 (
#
) 标记注释的开始(如果它不在引号字符串或$(…)
中),美元符号(用于扩展变量 – 见下文),
括号(
(
和)
)——取决于上下文,shell 重定向字符(
>
、<
、2>
、|
等),星号(
*
)和问号(?
),因为它在 globs 中使用,方括号(因为它们列出字符),
comma-separated
{…}
中的文本(因为它提供了多种文本变体 –{foo,bar}baz
扩展为foobaz barbaz
),也许还有其他人,
当然还有换行符。
根据 the page linked by you,
.env
文件是常规 bash
脚本。这意味着:
一个字符串不能包含多个单词(space-separated 部分),除非用引号括起来。¹
FOO_VAR='multiple words' # This works. ANOTHER_VAR="foo bar" # This works, too. BAR_VAR=this does not work # Executes “does” with args # “not work” and variable # BAR_VAR=“this”.
如果文本被双引号括起来或没有被任何引号括起来,则执行变量扩展。
my_var=42 VARIABLES="foo ${my_var}" # Gives “foo 42”.
可以执行 Shell 命令来生成字符串。²
CURRENT_DATE="$(date)" # Executes “date” and uses its # stdout as the value. DO_NOT_DO_THIS=$(date) # First expands the command, and we # then get multiple unquoted words. AVOID_THIS="`date`" # Non-standard syntax, accepted by bash.
¹ 在另一种情况下,它将 运行 第二个和所有后面的“单词”作为具有给定变量的 shell 命令。请参阅 bash(1)
联机帮助页。
² 根据文档,Microsoft Windows 不支持它。它没有说明 Windows.
上的变量扩展语法