如何用sed结合变量与双引号实现脚本自修改路径变量?
用sed实现Bash脚本自修改变量的解决方案
你要实现的是让Bash脚本通过sed修改自身的mnt变量定义,下次运行时生效,但原脚本因为特殊字符未转义、目标文件错误和匹配规则问题没达到预期。
问题根源
- 原命令里的
/*/会被Shell当作通配符解析,而非正则表达式的字面量 - 双引号包裹sed规则时,变量和特殊字符会被Shell提前解析,导致sed拿到的规则不符合预期
- 目标文件写的是
file,而非脚本自身的路径$0
修正后的脚本
#!/bin/bash main () { newdir="/okl/dfsdf/dfsf/" # 仅替换脚本中首次出现的mnt="/*/"定义 sed -i '0,/mnt="\/\*\/"/s//mnt="'"$newdir"'"/' "$0" } main
关键说明
- 匹配首次出现:
0,/pattern/是sed的地址范围语法,只处理从文件开头到首次匹配pattern的行,避免替换所有符合规则的行 - 转义特殊字符:正则里的
/和*需要转义为\/和\*,因为sed默认用/作为分隔符,*是正则元字符 - 变量拼接:用
'"$newdir"'的方式在sed规则中插入Shell变量——先关闭单引号(避免变量被sed解析),插入双引号包裹的$newdir(防止路径含空格时出错),再重新打开单引号 - 修改自身:
"$0"代表当前运行的脚本路径,让sed直接修改脚本文件本身
额外注意事项
- 测试前务必备份脚本,避免正则写错导致脚本损坏
- 如果
mnt变量定义有空格(比如mnt = "/*/"),需要调整正则为mnt\s*="\/\*\/"来匹配空格 - 脚本运行一次后,再次启动时
mnt变量就会被替换为$newdir的内容
内容的提问来源于stack exchange,提问作者rhadamanthe
相关产品推荐
相关产品推荐

