.env 文件何时需要引号?

use*_*531 35 php linux environment-variables symfony dotenv

例如,Symfony 的configuration-environment-variables-in-env-files 文档提供了示例:

DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name"
DB_USER=root
Run Code Online (Sandbox Code Playgroud)

为什么第一个示例使用引号(又名括号)而不是第二个示例?

如果适用的答案取决于解析 .env 文件的应用程序,请基于 Symfony。

jiw*_*ene 58

TL;DR 解决方案:当字符串包含空格或某些特殊字符和某些语法时,请使用引号。这些包括:

\n
    \n
  • 空格和其他空白,

    \n
  • \n
  • 反斜杠(转义空格,换行符 \xe2\x80\x93\\ 即使在不带引号的字符串中也给出空格),

    \n
  • \n
  • 引号(但可以组合多个引号mark\\ \'styles like\'"this"),

    \n
  • \n
  • 井号 ( #) 标记注释的开始(如果不在引号字符串或 中$(\xe2\x80\xa6)),

    \n
  • \n
  • 美元符号(用于扩展变量 \xe2\x80\x93 见下文),

    \n
  • \n
  • 括号 (()) \xe2\x80\x93 取决于上下文,

    \n
  • \n
  • shell 重定向字符(><2>|),

    \n
  • \n
  • 星号 ( *) 和问号 ( ?),因为它用于 glob,

    \n
  • \n
  • 方括号(因为它们列出字符),

    \n
  • \n
  • 逗号分隔的文本{\xe2\x80\xa6}(因为它提供了文本 \xe2\x80\x93{foo,bar}baz扩展为 的多种变体foobaz barbaz),

    \n
  • \n
  • 也许其他人,

    \n
  • \n
  • 当然,还有换行符。

    \n
  • \n
\n
\n

.env根据您链接的页面,文件是常规bash脚本。这意味着:

\n
    \n
  • 一个字符串不能包含多个单词(空格分隔的部分),除非用引号引起来。\xc2\xb9

    \n
    FOO_VAR=\'multiple words\'    # This works.\nANOTHER_VAR="foo bar"       # This works, too.\n\nBAR_VAR=this does not work  # Executes \xe2\x80\x9cdoes\xe2\x80\x9d with args\n                            # \xe2\x80\x9cnot work\xe2\x80\x9d and variable\n                            # BAR_VAR=\xe2\x80\x9cthis\xe2\x80\x9d.\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 如果文本用双引号引起来或未用任何引号引起来,则执行变量扩展。

    \n
    my_var=42\nVARIABLES="foo ${my_var}"  # Gives \xe2\x80\x9cfoo 42\xe2\x80\x9d.\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 可以执行 Shell 命令来生成字符串。\xc2\xb2

    \n
    CURRENT_DATE="$(date)"  # Executes \xe2\x80\x9cdate\xe2\x80\x9d and uses its\n                        # stdout as the value.\nDO_NOT_DO_THIS=$(date)  # First expands the command, and we\n                        # then get multiple unquoted words.\nAVOID_THIS="`date`"  # Non-standard syntax, accepted by bash.\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n
\n

\xc2\xb9 在另一种情况下,它将使用给定变量将第二个及以后的所有 \xe2\x80\x9cwords\xe2\x80\x9d 作为 shell 命令运行。请参阅bash(1)联机帮助页。

\n

\xc2\xb2 根据文档,Microsoft\xc2\xa0Windows 不支持它。它没有提及 Windows 上的变量扩展语法。

\n

  • `docker run` 子命令在使用引号和双引号的环境变量时存在问题,因为它不接受格式为有效 BASH(“Shell”)脚本的 *env 文件*。如果这是您的情况,您可能会对这个答案感兴趣 /sf/answers/5266610821/ 。 (2认同)