我写了一个脚本,从文件夹中获取一个txt文件,我想在文件末尾插入一行空白,然后写入。但我有一个问题,因为控制台返回:sed:-e表达式#1,char 4:未知命令:"。
这是代码:
adb shell "sudo cp /boot/uEnv.txt /home/rock/"
adb shell "sudo sed -i '$s/$/n/' /home/rock/uEnv.txt"
adb shell "sudo sed -i '$i extraargs=rtl8723ds.rtw_initmac="MACAUXTXT"' /home/rock/uEnv.txt"
adb shell "sudo sed -i "s/MACAUXTXT/$(cat /sys/class/net/wlan0/address | sed 's/.{9}//' | sed 's/^/00:e0:4c:/' )/" /home/rock/uEnv.txt"
adb shell "sudo cp /home/rock/uEnv.txt /boot/"
adb shell "sudo cp /home/rock/Service/20-rock.conf /usr/lib/NetworkManager/conf.d/"
adb shell "sudo rm /home/rock/Service/rockpi-backup.sh"
adb shell "sudo rm /home/rock/Service/20-rock.conf"
adb shell "sudo rm /home/rock/uEnv.txt"
这是个问题:在这里输入图像描述
问题在于嵌套引用:
adb shell "sudo sed -i '$s/$/n/' /home/rock/uEnv.txt"
运行adb
命令的shell处理其所有参数,包括双引号中的sudo ...
部分。由于双引号允许外壳进行变量扩展,因此$s
在执行sed
甚至sudo
之前进行扩展。根据您在名为s
的变量中存储的内容,它将被sed
替换并最终处理。如果没有s
变量,则会替换一个空字符串,$s
将消失。
如果你用echo
代替adb
:,你可以自己看看
echo shell "sudo sed -i '$s/$/n/' /home/rock/uEnv.txt"
shell sudo sed-i'/$/\n/'/home/rock/uEnv.txt
现在sed
的中间参数是/$/n/
而不是$s/$/n/
。/$/
被解释为一个正则表达式过滤器来决定对哪些行进行操作,n/
被解释为命令及其参数。由于不是一个有效的命令,您将得到描述的错误。
有几种方法可以做到这一点。
我一时想不出一个好的解决方案,但有一个解决方案是避开最顶部外壳中的美元符号,这样它就可以原封不动地传递到子外壳:
adb shell "sudo sed -i '$s/$/n/' /home/rock/uEnv.txt"
我也很好地避开了第二个美元符号,尽管在你的情况下,它没有效果。它没有被替换,因为/
不是一个合法的变量名。但是,如果您后来决定(例如(将sed
命令的分隔符更改为#
,以处理模式或替换字符串中的文件名,则第二个美元符号可能已经成为一个问题,因为#
是参数计数shell变量的名称。