Bash脚本字符串匹配失效:如何替换模板字符生成Docker YAML配置
Bash脚本模板替换失效问题修复
你的脚本主要有几个关键问题导致替换失效:
- Bash变量赋值不能有空格,原脚本里
line = $customer这种写法是错误的 - 替换后的变量没有写入目标文件,只有else分支执行了写入操作
- 未处理目录已存在的情况,
mkdir会报错 - 未用引号包裹变量,可能导致空格或特殊字符异常
以下是修正后的完整脚本:
#!/bin/bash # 读取输入 read -p '输入客户名称: ' customer read -p '输入管理员名称: ' admin read -p '输入管理员密码: ' pass # 创建目录(-p参数避免目录已存在时报错) mkdir -p ~/"$customer" # 定义目标文件路径 target_file=~/"$customer"/"$customer".yaml # 模板文件路径 input="/home/x/1.txt" # 逐行读取模板文件 while IFS= read -r line do # 判断并替换变量 if [[ "$line" == "q" ]]; then line="$customer" elif [[ "$line" == "r" ]]; then line="$admin" elif [[ "$line" == "4" ]]; then line="$pass" fi # 无论是否替换,都将内容写入目标文件 echo "$line" >> "$target_file" done < "$input"
关键修改说明:
- 变量赋值修正:把
line = $customer改成line="$customer",Bash中赋值符号=前后不能有空格,否则会被当成命令执行 - 统一写入逻辑:将写入文件的操作移到if判断外,确保替换后的内容也能写入目标文件,原脚本只有未匹配的行才写入,替换后的行被丢弃了
- 目录创建优化:给
mkdir加-p参数,即使目录已存在也不会报错 - 引号包裹变量:所有变量引用都用双引号包裹,避免空格、特殊字符导致的异常
- 目标文件路径变量化:用变量存储目标文件路径,提升脚本可读性和维护性
内容的提问来源于stack exchange,提问作者Антон Дихтярук
相关产品推荐
相关产品推荐

