如何使用bash/sed循环修改配置启动程序并设置启动延迟?
问题诊断
- 核心原因是你用
&&串联了所有步骤,任意一步执行失败都会中断后续操作,循环直接终止。常见触发失败的场景包括:cd /path_to_my_script/写在循环内部,第一次执行后工作目录已经切换到目标路径,第二次循环再次执行同路径cd如果有权限问题、路径误写会直接报错,后续操作全部中断- 恢复myscript.txt的sed命令强依赖上一步替换是否成功:如果前一次替换min/max失败,恢复时匹配不到
local min = ${i}这类字符串,sed执行返回非零值,直接断链,下一轮循环的sed找不到初始的123456789占位符也会持续失败 - 如果你调用的目标程序是后台运行模式,
&&后的sed恢复命令会立刻执行,程序还没读取完myscript.txt就被改回初始值,也会导致程序执行失败断链 - 开头
j = 1存在语法错误(bash变量赋值等号两侧不能有空格),不过你循环内重新赋值了j,这个错误不会直接导致循环中断,但属于不规范写法
修正后代码
#!/bin/bash # 提前切换到工作目录,避免循环内重复执行cd出错 cd "/path_to_my_script/" || exit 1 for i in {1..1021..34}; do j=$((i + 33)) echo "当前轮次: min=$i, max=$j" # 修改配置文件 sed -i "s/local min = 123456789/local min = ${i}/g" myscript.txt sed -i "s/local max = 123456789/local max = ${j}/g" myscript.txt # 运行程序,如果程序是后台运行,需要去掉下面两行的注释,等程序执行完再恢复配置 # run program using myscript.txt & # wait $! run program using myscript.txt # 强制恢复配置,兼容所有已写入的数值,不依赖上一轮替换结果 sed -i "s/local min = [0-9]*/local min = 123456789/g" myscript.txt sed -i "s/local max = [0-9]*/local max = 123456789/g" myscript.txt sleep 5 done
修正说明
- 把cd操作移到循环外,提前切换到目标路径,避免循环内重复执行出错
- 去掉不必要的&&串联,确保就算某一步非核心操作出错,循环也能继续执行
- 恢复配置的sed改成匹配任意数字的写法,不管之前替换的是啥值都能正确恢复成初始占位符,避免下一轮替换失败
- 补充了后台运行程序的适配方案,避免程序还没读取配置就被改回初始值
- 去掉了错误的变量赋值写法,优化了日志输出
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

