如何读取CSV参数调用现有Bash脚本批量生成YAML模板文件
可行实现方案
下面提供两种可直接落地的方案,你可以根据自己的需求选择:
方案1:最小改动复用现有脚本
不需要修改你已经在用的script.sh,只需要新增一层CSV读取逻辑,逐行生成临时变量文件调用原有脚本即可。
前置要求
- CSV第一行为变量名表头,和你模板中的
{{变量名}}一一对应 - 默认CSV分隔符为逗号,可自行修改为制表符等其他分隔符
示例脚本
#!/bin/bash # 按需修改以下配置项 TEMPLATE_PATH="template.yml" CSV_PATH="variables.csv" EXISTING_SCRIPT="./script.sh" OUTPUT_NAME_PREFIX="Template" # 读取表头拿到变量名列表 IFS=, read -r -a var_list < "$CSV_PATH" row_index=0 # 逐行读取CSV内容 while IFS=, read -r -a value_list; do # 跳过表头行 ((row_index++ == 0)) && continue # 生成临时变量文件,适配原有script.sh的-f参数格式 temp_var_file=$(mktemp) for idx in "${!var_list[@]}"; do # 自动去除CSV值首尾的双引号(可选,根据你的CSV格式调整) cleaned_value=$(echo "${value_list[$idx]}" | sed -e 's/^"//' -e 's/"$//') echo "${var_list[$idx]}=$cleaned_value" >> "$temp_var_file" done # 调用原有脚本生成对应YAML文件 "$EXISTING_SCRIPT" "$TEMPLATE_PATH" -f "$temp_var_file" > "${OUTPUT_NAME_PREFIX}${row_index}.yml" # 清理临时文件 rm -f "$temp_var_file" done < "$CSV_PATH"
适配调整说明
- 如果CSV用制表符分隔,把所有
IFS=,替换为IFS=$'\t' - 如果不需要自动去除值的双引号,删除sed处理的逻辑即可
方案2:无额外依赖原生实现
如果你不想依赖原有script.sh,可以直接用系统自带的envsubst+sed实现模板渲染,无需额外安装工具。
示例脚本
#!/bin/bash # 按需修改以下配置项 TEMPLATE_PATH="template.yml" CSV_PATH="variables.csv" OUTPUT_NAME_PREFIX="Template" # 预处理模板:将{{变量名}}格式转换为envsubst识别的${变量名}格式 processed_template=$(sed -e 's/{{\([a-zA-Z0-9_]*\)}}/${\1}/g' "$TEMPLATE_PATH") # 读取表头 IFS=, read -r -a var_list < "$CSV_PATH" row_index=0 while IFS=, read -r -a value_list; do ((row_index++ == 0)) && continue # 导出所有变量到当前环境 for idx in "${!var_list[@]}"; do cleaned_value=$(echo "${value_list[$idx]}" | sed -e 's/^"//' -e 's/"$//') export "${var_list[$idx]}"="$cleaned_value" done # 直接渲染输出YAML echo "$processed_template" | envsubst > "${OUTPUT_NAME_PREFIX}${row_index}.yml" done < "$CSV_PATH"
注意事项
- 如果你的YAML模板本身包含
$符号,需要提前转义为\$避免被误替换 - 若需要严格校验YAML格式合法性,建议替换渲染逻辑为专门的YAML处理工具
yq,比纯文本替换更安全
内容的提问来源于stack exchange,提问作者Jo0l
相关产品推荐
相关产品推荐

