Shell脚本中使用Sed命令编辑/etc/rc.local的问题求助:插入含变量的挂载绑定行及删除指定行
我来帮你搞定这两个Shell脚本的需求,先解决你遇到的sed语法错误问题,再给出删除对应行的方案:
1. 在/etc/rc.local的begin行后插入挂载命令
你之前的sed命令报错是因为两个核心问题:一是没指定sed的追加操作(a),二是引号与变量展开的逻辑处理有误。下面分两种场景给出正确实现:
基础版(变量无特殊字符时可用)
直接用sed -i原地修改文件,精确匹配begin行后插入挂载命令:
# 假设$uname和$dname已由用户输入定义 sed -i "/^begin$/a mount --bind /var/www/${dname}/htdocs /home/${uname}/${dname}/htdocs" /etc/rc.local
/^begin$/:精确匹配单独一行的begin,避免误匹配包含begin的其他行a:sed的追加命令,在匹配到的行之后插入新内容- 用双引号包裹整个sed脚本,让Shell自动展开
$uname和$dname变量
安全版(处理变量含特殊字符)
如果$dname或$uname里包含/、&这类sed敏感字符,需要先转义避免报错:
# 转义变量中的特殊字符 escaped_dname=$(printf '%s\n' "$dname" | sed 's/[\/&]/\\&/g') escaped_uname=$(printf '%s\n' "$uname" | sed 's/[\/&]/\\&/g') # 执行插入操作 sed -i "/^begin$/a mount --bind /var/www/${escaped_dname}/htdocs /home/${escaped_uname}/${escaped_dname}/htdocs" /etc/rc.local
2. 根据$dname删除/etc/rc.local中的对应挂载行
要删除包含指定$dname的挂载命令行,同样需要注意sed的匹配语法和特殊字符处理:
基础版
sed -i "/mount --bind \/var\/www\/${dname}\/htdocs \/home\/.*\/${dname}\/htdocs/d" /etc/rc.local
d:sed的删除命令,匹配到符合模式的行直接删除- 因为sed默认用
/作为分隔符,所以路径里的/要转义成\/
更简洁的安全版(换用#作为分隔符)
换用#作为sed的模式分隔符,不用转义路径里的/,可读性更强:
# 转义变量中的特殊字符(这里要处理#) escaped_dname=$(printf '%s\n' "$dname" | sed 's/[#&]/\\&/g') # 删除对应行 sed -i "\#mount --bind /var/www/${escaped_dname}/htdocs /home/.*${escaped_dname}/htdocs#d" /etc/rc.local
⚠️ 注意:操作/etc/rc.local需要root权限,脚本运行时要加上sudo或以root用户执行。
内容的提问来源于stack exchange,提问作者syndicate
相关产品推荐
相关产品推荐

