最近的一个任务需要用shell脚本实现,这也是我第一次正式的写shell脚本。由于之前没怎么写过shell脚本,所以流程的每一步我都需要上网查,然后实验,过程还是挺艰难的。网上能查到的比较多的相关知识我就不赘述了,写一些我认为不是特别多的吧。
脚本要实现一个什么功能呢?在服务器上实现嵌入式设备程序的自动下载、编译、升级、验证。
下载:git下载,多地址,多分支,多版本,需要校验。
编译:简单cmake编译,只不过是需要支持多个编译链而已,没什么可说的。
升级:在脚本中telnet到验证用的嵌入式设备中,将升级包tftp到设备中,运行新升级包。
验证:验证升级包是否能够正常运行,验证成功需要版本号增加再git push。
大概就是这么一个逻辑,脚本是配合其他服务一起实现一个非常方便的功能,这里不细说。但看上面的描述应该能够大概知道这个脚本的功能。下面写一点我学到的。
1、git clone代码可以直接带用户名密码,不用再手动输入用户名,再输入密码。需要注意的是"@"需要换成"%40",这个网上有相关博客。
地址格式大概这样: git clone -b 分支名 https://用户名:密码@剩余git地址
2、在脚本中telnet到设备需要用到另外一种语言的脚本expect,在java开发中经常需要,因为他们需要ssh到另外一台设备,这个使用用expect脚本实现自动输入用户名和密码非常容易,我使用的telnet也不例外。
3、expect脚本慎用sleep,能不用就不用。sleep的执行时间也许不是你所想的,我的脚本加sleep就是在添加sleep前面一些行执行的。所以我拆分了多个脚本实现了我的功能,需要等待的时候是退回到bash脚本中进行的sleep。
4、expect脚本慎用set timeout XX命令。这个命令是修改每行命令的超时时间,脚本好像是以文本中最后一个set timeout的时间为准,也就是说不支持动态调整。有些命令你想10秒钟超时,有些你想30秒超时,对不起,实现不了。所以我进行了脚本拆分。
5、expect脚本的执行某个可执行程序。我这里需要在expect脚本中 ./ 执行新程序,这里我又不得不进行了脚本的拆分,因为我直接在expect中执行,我的expect脚本无法退回到我的bash脚本。无论我是否后台,等待多久,程序就是无法退回。
其他的我就不写了,都是shell非常普遍的功能,各种:传参,if判断,while循环,字符串分割,字符串替换,查找某个字符,git的回滚,git的提交,文本的修改(sed)......这些在网上你找有很多,没什么太大记录价值。如果有想了解的可以留言,如果知道我会答复。