Shell脚本使用sed查找替换指定模式时变量未展开问题求解
问题原因
Shell 中单引号包裹的字符串会保留所有字面量字符,不会触发变量展开、转义符解析等操作。你在sed的替换规则外使用了单引号,导致$work_dir被作为普通字符串直接传递给sed,没有被替换为对应的实际路径。
解决方法
将sed表达式外层的单引号替换为双引号即可,双引号会自动解析内部的Shell变量:
# 基础修改方案,适用于$work_dir路径中不包含`/`以外特殊字符的场景 sed -i "s/setenv workspace.*/setenv workspace $work_dir/g" ${syn_file}
如果$work_dir的路径中可能包含/字符(绝大多数路径场景都会有),建议更换sed的分隔符为#、|等不会在路径中出现的字符,避免分隔符冲突导致语法报错:
# 更稳妥的通用方案 sed -i "s#setenv workspace.*#setenv workspace $work_dir#g" ${syn_file}
注:如果你使用的是macOS系统,
sed -i需要额外传入空字符串作为备份后缀,写法调整为sed -i '' "s#setenv workspace.*#setenv workspace $work_dir#g" ${syn_file}。
内容的提问来源于stack exchange,提问作者krishna chaitanya
相关产品推荐
相关产品推荐

