Sed追加文件时$DEVICE_NAME变量未替换问题求助
解决Sed中Bash变量未被替换的问题
这个问题我太熟悉了——本质是Bash单引号与双引号的变量解析规则在搞鬼!
问题根源
你当前的sed命令中,-e后面的整个脚本是被单引号包裹的。而Bash的核心规则是:单引号内部的所有字符都会被当作字面量处理,不会展开任何变量。所以$DEVICE_NAME并没有被Bash替换成实际的设备名,而是直接作为原始字符串传给sed,最终原样写入了$BUILDPROP文件。
两种可行解决方案
方案1:拆分单引号与双引号,仅变量部分用双引号
把包含$DEVICE_NAME的片段单独用双引号包裹,其余部分保持单引号,让Bash只展开需要的变量:
sed -i -e '$a\ persist.sys.timezone=Europe/Rome \ ro.miui.region=IT \ ro.miui.cust_variant=it \ ro.product.locale.language=it \ ro.product.locale.region=IT \ ro.product.mod_device='"$DEVICE_NAME"'_miuita_global \ ro.miui.mcc=9998 \ ro.miui.mnc=9999 \ net.dns2=8.8.4.4' $BUILDPROP
原理:Bash会把'xxx'"$VAR"'yyy'拆成三部分拼接——单引号里的xxx、双引号里展开后的变量值、单引号里的yyy,这样既保留了其他内容的字面量,又让$DEVICE_NAME被正确替换。
方案2:将整个sed脚本改为双引号,转义需要保留的$
如果更习惯用双引号包裹整个脚本,需要把原本sed要用到的$a里的$转义成\$,避免Bash把它当作变量解析:
sed -i -e "\$a\ persist.sys.timezone=Europe/Rome \ ro.miui.region=IT \ ro.miui.cust_variant=it \ ro.product.locale.language=it \ ro.product.locale.region=IT \ ro.product.mod_device=$DEVICE_NAME_miuita_global \ ro.miui.mcc=9998 \ ro.miui.mnc=9999 \ net.dns2=8.8.4.4" $BUILDPROP
这里\$a告诉Bash:这个$是sed的语法(表示匹配最后一行),不要展开它;而$DEVICE_NAME因为在双引号里,会被正常替换为实际设备名。
验证建议
可以先去掉-i参数执行命令,查看输出是否符合预期,确认变量替换正确后再加上-i修改文件,避免误操作。
内容的提问来源于stack exchange,提问作者ale8530
相关产品推荐
相关产品推荐

