如何通过Bash脚本处理export格式密钥文件,提取键值生成对应文件?
修正后的Bash脚本实现密钥文件转换逻辑
完整修正脚本
#!/bin/bash # 确保output目录存在,不存在则创建 mkdir -p output # 遍历input目录下所有.txt文件 for file in input/*.txt; do # 跳过不存在的文件(避免input目录无txt文件时报错) [[ -f "$file" ]] || continue # 1. 在当前shell环境中source加载文件,使环境变量生效 source "$file" # 2. 提取key:移除行首的export及空格,取第一个等号前的内容 key=$(awk -F'=' '{gsub(/^export[[:space:]]*/, "", $1); print $1}' "$file") # 3. 通过bash间接引用获取对应环境变量的真值 value=${!key} # 4. 写入output目录下以key命名的文件(-n避免自动添加换行符) echo -n "$value" > "output/$key" done
关键修正点说明
- 目录预检查:用
mkdir -p保证output目录存在,避免写入时因目录缺失报错。 - 安全遍历文件:加入
[[ -f "$file" ]] || continue处理input目录无txt文件的边界情况。 - 准确提取key:通过awk移除
export前缀及空格,精准定位第一个等号前的变量名,适配文件格式要求。 - 环境变量真值获取:使用bash间接引用语法
${!key},直接读取source后生效的环境变量值,避免解析文件引号带来的误差。
配套验证逻辑(test.py示例)
import os import re input_dir = "input" output_dir = "output" # 从input文件解析预期的key-value映射 expected = {} for filename in os.listdir(input_dir): if not filename.endswith(".txt"): continue with open(os.path.join(input_dir, filename), "r") as f: line = f.read().strip() match = re.match(r'export\s+(\w+)="(.*)"', line) if match: expected[match.group(1)] = match.group(2) # 验证output文件内容与预期一致 for key, val in expected.items(): output_path = os.path.join(output_dir, key) assert os.path.exists(output_path), f"缺失文件: {output_path}" with open(output_path, "r") as f: assert f.read().strip() == val, f"key {key} 值不匹配" # 验证环境变量与预期一致 for key, val in expected.items(): assert os.getenv(key) == val, f"环境变量 {key} 值不匹配" print("所有验证通过!")
内容的提问来源于stack exchange,提问作者Amin Ba
相关产品推荐
相关产品推荐

