.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.

上的变量扩展语法