Bash自动化补丁脚本中双变量查找替换失效问题求助
解决sed替换未生效的问题
嘿,我瞅了你的脚本,备份功能正常但sed替换没生效,问题出在两个关键地方,咱们一步步来改:
1. 单引号导致变量无法被解析
你用单引号包裹sed命令的话,bash会把里面的$oldjdk和$newjdk当成普通字符串,不会替换成你输入的实际JDK路径。得换成双引号,这样bash才会先解析变量再传给sed。
2. 路径中的斜杠与sed分隔符冲突
JDK路径里肯定包含/,而你用/作为sed替换命令的分隔符,sed会把路径里的/当成命令的一部分,导致匹配逻辑混乱。这时候换个分隔符就行,比如#或者|,选一个不在路径里出现的字符就行。
修正后的sed命令
把原来的sed行改成这样:
sed -i -e "s#$oldjdk#$newjdk#g" nodemanager.properties
额外的优化建议
- 直接用命令的退出状态做判断,比单独检查
$?更可靠,还能简化代码:if ! sed -i -e "s#$oldjdk#$newjdk#g" nodemanager.properties; then echo -e "find and replace failed for nodemanager.properties" echo -e "Terminating script" exit 1 # 失败用非0退出码,方便外部程序判断状态 fi - 如果你的JDK路径里包含正则特殊字符(比如
.、*、[]),得先转义这些字符,避免sed匹配出错。可以用下面的方式处理变量:# 转义oldjdk中的特殊字符 escaped_old=$(printf '%s' "$oldjdk" | sed 's/[#&/\]/\\&/g') # 转义newjdk中的特殊字符 escaped_new=$(printf '%s' "$newjdk" | sed 's/[#&/\]/\\&/g') # 执行替换 sed -i -e "s#$escaped_old#$escaped_new#g" nodemanager.properties
完整的修正后脚本片段(关键部分)
read -p "Please enter the current jdk path: " oldjdk read -p "Please enter the new jdk path: " newjdk echo "Backing up an uploading files to remote server...." cd $nodemanager || exit cp nodemanager.properties nodemanager_$date.bkp if [ $? -ne 0 ]; then echo -e "nodemanager.properties backup failed" echo -e "Terminating script" exit 1 fi # 修正后的替换命令 escaped_old=$(printf '%s' "$oldjdk" | sed 's/[#&/\]/\\&/g') escaped_new=$(printf '%s' "$newjdk" | sed 's/[#&/\]/\\&/g') if ! sed -i -e "s#$escaped_old#$escaped_new#g" nodemanager.properties; then echo -e "find and replace failed for nodemanager.properties" echo -e "Terminating script" exit 1 fi echo -e "nodemanager.properties operations completed successfully\n"
内容的提问来源于stack exchange,提问作者Burnt Frets
相关产品推荐
相关产品推荐

