bash脚本调用sed替换配置文件shard编号报错如何解决?
错误原因
- 你的配置文件中存在6行带
shard-1的记录,执行grep -o 'shard-1' $DPATH会返回6行匹配结果,导致变量i中存储了6行换行分隔的1,执行算术运算m=$((i+1))时shell无法解析多行数字,触发语法错误。 - 同理变量
k中存储了6行换行分隔的shard-1,代入sed的替换规则时,换行符会打断s命令的结构,导致sed报「unterminated `s' command」错误。
修复后的脚本
#!/bin/bash DPATH="/etc/jitsi/videobridge/sip-communicator.properties" # 提取所有shard后的数字,取最大值作为当前序号 current_shard_num=$(grep -oP 'shard-\K\d+' "$DPATH" | sort -nr | head -n 1) # 兜底判断:配置文件无shard记录时默认从0开始,自增后就是1 [ -z "$current_shard_num" ] && current_shard_num=0 new_shard_num=$((current_shard_num + 1)) old_tag="shard-$current_shard_num" new_tag="shard-$new_shard_num" # 全局替换所有旧shard编号 sed -i "s|$old_tag|$new_tag|g" "$DPATH"
补充说明
- 脚本使用
grep -P的正则特性提取shard后的数字,配合sort -nr倒序排序取最大值,即便后续shard编号增长到2、3等也能正确自增 - 所有变量引用都添加了双引号,避免路径或值含特殊字符时出现异常
- 新增了兜底判断逻辑,首次运行配置文件无shard记录时也能正常生成shard-1
内容的提问来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

