环境变量转换
开发工具
正在载入
正在加载工具
正在准备工具,暂时无法估算剩余时间。
本工具的全部运算都发生在你的浏览器中,输入内容不会发送到任何服务器。
关于这个工具
保留原有 .env ↔ JSON 双向转换,也可在浏览器本地比较前后两份环境变量文本。明确区分新增、删除、变化、未变与歧义,并保留缺失、空字符串和纯空白的区别。结果默认隐藏值,可生成仅含占位值的 .env.example,或明确选择包含值的 JSON 报告。
常见用途
- 比较两份已提供的 .env 文本,查找部署设置缺失或名称变化,无需连接服务器;重命名显示为一次删除和一次新增。
- 从合法且无歧义的变量名生成新人配置用的 .env.example,移除全部原始值与注释。
- 继续将 .env 赋值转换为 JSON 字符串,或将 JSON 对象属性转换为 .env 文本;复用前检查引号与类型转换。
使用方法
- 1.需要原有转换时选择 .env → JSON 或 JSON → .env;需要比较时切换模式,分别粘贴修改前与修改后的文本。比较中的空文本表示没有变量,转换模式仍要求非空输入。
- 2.执行比较,检查源行诊断和五种状态计数,再按状态筛选或翻页。隐藏值时仍显示缺失、空、纯空白和非空状态。先修复无效行;重复键在消除歧义前不能视为一个确定值。
- 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 文本。转换器沿用原有引号/注释行为,比较器采用上述更严格的自定义子集。