返回

环境变量转换

开发工具

正在载入

正在加载工具

正在准备工具,暂时无法估算剩余时间。

本工具的全部运算都发生在你的浏览器中,输入内容不会发送到任何服务器。

关于这个工具

保留原有 .env ↔ JSON 双向转换,也可在浏览器本地比较前后两份环境变量文本。明确区分新增、删除、变化、未变与歧义,并保留缺失、空字符串和纯空白的区别。结果默认隐藏值,可生成仅含占位值的 .env.example,或明确选择包含值的 JSON 报告。

常见用途

  • 比较两份已提供的 .env 文本,查找部署设置缺失或名称变化,无需连接服务器;重命名显示为一次删除和一次新增。
  • 从合法且无歧义的变量名生成新人配置用的 .env.example,移除全部原始值与注释。
  • 继续将 .env 赋值转换为 JSON 字符串,或将 JSON 对象属性转换为 .env 文本;复用前检查引号与类型转换。

使用方法

  1. 1.需要原有转换时选择 .env → JSON 或 JSON → .env;需要比较时切换模式,分别粘贴修改前与修改后的文本。比较中的空文本表示没有变量,转换模式仍要求非空输入。
  2. 2.执行比较,检查源行诊断和五种状态计数,再按状态筛选或翻页。隐藏值时仍显示缺失、空、纯空白和非空状态。先修复无效行;重复键在消除歧义前不能视为一个确定值。
  3. 3.为 .env.example 选择修改前、修改后或两侧并集,审阅变量名后复制或下载。JSON 报告默认隐藏值;显示表格值与在报告中包含值需分别主动选择。修改输入会使结果失效并重置值显示。

可执行的转换与比较示例

将环境变量赋值转换为 JSON 字符串

APP_NAME=EveryTools
DEBUG=true
export API_URL="https://example.test"
{
  "APP_NAME": "EveryTools",
  "DEBUG": "true",
  "API_URL": "https://example.test"
}

选择 .env → JSON。三个值均保持字符串,包括 true。可选 export 前缀会被移除;转换器不会把变量加载到浏览器或进程环境中。

转换 JSON 并明确字符串化规则

{"APP_NAME":"EveryTools","EMPTY":"","FLAGS":["a","b"],"DEBUG":true}
APP_NAME=EveryTools
EMPTY=""
FLAGS="[\"a\",\"b\"]"
DEBUG=true

选择 JSON → .env。空字符串保持显式,布尔值变为文本,数组变成带引号的 JSON 字符串。以后再转回 JSON 时,不会恢复最初的 JSON 值类型。

检查四种无歧义的环境变量变化状态

before:
APP=demo
PORT=3000
OLD=retire

after:
APP=demo
PORT=4000
NEW=added
[{"key":"APP","status":"unchanged","before":"value","after":"value"},{"key":"NEW","status":"added","before":"missing","after":"value"},{"key":"OLD","status":"removed","before":"value","after":"missing"},{"key":"PORT","status":"changed","before":"value","after":"value"}]

将 before 与 after 两部分分别粘贴到比较输入框。以下输出为按键排序的名称/状态/值状态摘要,不是完整下载报告。PORT 有变化,而 APP 保持未变。

区分变量缺失、空字符串与纯空白

before:
EMPTY=
SPACE=" "
GONE=

after:
EMPTY=""
SPACE=
ADDED=" "
[{"key":"ADDED","status":"added","before":"missing","after":"whitespace"},{"key":"EMPTY","status":"unchanged","before":"empty","after":"empty"},{"key":"GONE","status":"removed","before":"empty","after":"missing"},{"key":"SPACE","status":"changed","before":"whitespace","after":"empty"}]

摘要只展示值状态,无需展示值本身。缺失、空字符串与纯空白是三个不同状态。EMPTY 虽然引号不同,解码后仍为空;SPACE 则从一个空格变为空。

比较解码引号、注释与字面引用文本

before:
export HASH="a#b" # comment
LINE="a\nb"
REF=${HOME}
COMMAND="$(whoami)"
PATH='C:\temp'

after:
HASH=a#b
LINE="a\u000ab"
REF='${HOME}'
COMMAND='$(whoami)'
PATH="C:\\temp"
[{"key":"COMMAND","status":"unchanged","before":"value","after":"value"},{"key":"HASH","status":"unchanged","before":"value","after":"value"},{"key":"LINE","status":"unchanged","before":"value","after":"value"},{"key":"PATH","status":"unchanged","before":"value","after":"value"},{"key":"REF","status":"unchanged","before":"value","after":"value"}]

两侧解码后的值相同。单个源行中的 JSON \n 与 \u000a 都编码同一个换行字符。变量引用和类似命令的文本仅按字面处理,不展开、不执行,也不发起网络请求。

让重复赋值保持显式歧义

before:
TOKEN=first
TOKEN=second
SAME=demo

after:
TOKEN=second
SAME=demo
[{"key":"SAME","status":"unchanged","before":"value","after":"value"},{"key":"TOKEN","status":"ambiguous","before":"ambiguous","after":"value"}]

TOKEN 在修改前第 1、2 行重复,因此标为歧义。只拿最后一次赋值和右侧匹配会掩盖冲突,工具不会选择其中一个。SAME 仍可正常比较。

生成只含固定占位值的并集示例

before:
__proto__=synthetic-before
constructor=synthetic-constructor
OLD=retired
# internal comment
DUP=first
DUP=second

after:
__proto__=synthetic-after
constructor=synthetic-constructor
NEW=synthetic-added
DUP=only
NEW=REPLACE_ME
OLD=REPLACE_ME
__proto__=REPLACE_ME
constructor=REPLACE_ME

生成 .env.example 时选择并集。两个特殊 JavaScript 属性名都是合法 ASCII 变量名。DUP 因左侧重复而被排除;原始值与注释均不进入示例,每个输出名称统一使用 REPLACE_ME。

遇到无效变量名时阻止整次比较

before:
GOOD=ok
BAD-NAME=synthetic

after:
GOOD=ok
{"valid":false,"rows":[],"beforeIssues":[{"code":"invalidKey","line":2}],"afterIssues":[]}

修改前第 2 行的 BAD-NAME 不符合 ASCII 键名规则。诊断摘要不产生任何比较行,避免误将 GOOD 报为未变。请先修复源文本;JSON 差异与 .env.example 导出均被阻止。

常见 .env 错误与泄露风险

  • 把未加引号且紧随空格的 # 当成值的一部分:需要保留这类文本时,请为值加上支持的引号。
  • 粘贴 shell 脚本或多行密钥:比较器只接受已说明的单行子集,不会执行脚本。
  • 以为重复键会自动取最后一个值:即使重复值看似相同,也必须审阅歧义。
  • 共享含值报告或显示值后的屏幕可能泄露凭据;隐藏值报告与示例中的变量名也可能敏感。
  • 把 REPLACE_ME 当作生产默认值:生成示例只是待审阅的变量名清单,不包含可用配置值。

限制与说明

  • 比较器采用明确记录的自定义单行子集,不宣称完整兼容 dotenv 或 shell。键名区分大小写,符合 ASCII [A-Za-z_][A-Za-z0-9_]*,包括 __proto__ 与 constructor。支持开头的 BOM、LF/CRLF、可选 export 和赋值两侧的 ASCII 空格/制表符。 双引号采用 JSON 转义;单引号仅解码转义的单引号与反斜杠,其余反斜杠按字面保留。引号内空格保留;未加引号的值裁剪两端 ASCII 空格/制表符。值开头或空格/制表符后的 # 开始注释,a#b 则是字面值。引号闭合后只允许空格/制表符及注释。
  • 拒绝多行值、单独 CR、水平制表符以外的原始控制字符、Unicode 行分隔符、无效名称、未闭合引号和有歧义的未加引号 shell 语法。未加引号的内部引号、反引号、反斜杠及 ; | & < > 需改用支持的引用形式。${HOME} 与 $(whoami) 只是数据,不执行变量展开、命令替换或求值。
  • 任何无效行都会阻止整次比较及 JSON/示例导出,不会把被忽略的行误报为删除。重复键保留源行并标为歧义,不选择任何一个值,也不采用最后一次覆盖规则。并集示例排除任一侧有重复的名称;单侧示例要求名称在所选侧唯一。
  • 每侧比较输入最多 200,000 个 UTF-16 代码单元、5,000 个物理行;导出最多 1 MB(1,000,000 个 UTF-8 字节)。最后一个行结束符不额外增加物理行。超限明确失败,不截断导出。原有转换器仍限制 200,000 字符及最多 5,000 行或 JSON 属性,并沿用自身的转换规则。
  • 全程在浏览器本地处理,不上传输入、不查询网络、不持久化。隐藏值是显示/导出选项,并非加密。包含值的 JSON 可能泄露密钥;隐藏值报告和 .env.example 仍暴露变量名与结构。示例值始终为 REPLACE_ME,不猜测默认值,也绝不复制原始值、注释或无效行。

常见问题

缺失变量、空值与纯空白有何区别?

缺失表示没有该名称的赋值。KEY= 与 KEY="" 都是空字符串;KEY=" " 含一个空格,属于纯空白,与空值不同。未加引号的两端空格会被裁剪。比较解码后的字符串,不归一化布尔值、数字或大小写。

同一个键出现两次会怎样?

结果保留两个源行号。即使重复值相同,仍标为歧义,而不是未变或取最后一个值。使用该值前请修复重复;并集 .env.example 会排除该名称。

默认隐藏值的 JSON 是否包含原始值?

默认报告省略 value 属性和原始输入行,保留名称、值状态、行号、变化状态及计数。主动选择包含值会加入解析后的值,可能泄露秘密。仅显示表格值不会自动允许在导出中包含值。

还能转换现有 .env 与 JSON 吗?

可以,原有两个转换方向都保留。.env → JSON 输出字符串值并拒绝重复键;JSON → .env 将布尔值和数字变为文本,null 变为空值,数组和对象序列化为 JSON 文本。转换器沿用原有引号/注释行为,比较器采用上述更严格的自定义子集。

相关工具