[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] shell脚本怎样批量更新git项目源码?

cd /opt/pidgin-lwqq/
cd /opt/lwqq/
当前分支 dev 是最新的。——如果以上两个项目更新命令返回的结果是这个,则不必再进行编译操作。

cd /opt/kwplayer-packages/
cd /opt/bcloud-packages/
cd /opt/bypy/
当前分支 master 是最新的。——如果以上两个项目更新命令返回的结果是这个,则不必再进行编译操作。

我有多个git项目位于/opt文件夹下,这些项目都是很棒的项目,当然也都是别人写得,于是开发进度和更新情况就受作者的情况而定了,那么我这里要做得就是每天打开电脑的时候,去每一个项目的文件夹下执行sudo git pull --rebase命令,这样就可以把项目的代码更新到最新。如果项目的返回结果是“当前分支 dev 是最新的。”或者是“当前分支 master 是最新的。”两条信息,那么就说明作者并没有上传最新的代码,我也就不用进入build文件夹去编译了.......

于是,这里可以发现一个问题,如同我帖子最开端的几个cd路径,这些项目显然比较多,如果每次都是逐个的输入路径,并逐个的运行sudo git pull --rebase命令,并且再对应地每次输入密码,那显然是相当费力的,于是我的问题是:
针对以上情况,写一个shell脚本,可以实现自动化更新项目,包括密码的自动输入。脚本要能够根据命令的返回结果自己执行是否再继续编译(编译部分的命令我可以自己写,只要大家帮忙写出框架即可)。

  1. cd /opt/pidgin-lwqq/
  2. sudo git pull --rebase | grep -q "是最新的" && echo 不需要编译 || echo 需要编译
  3. cd /opt/lwqq/
  4. sudo git pull --rebase | grep -q "是最新的" && echo 不需要编译 || echo 需要编译
复制代码
密码那部分,建议使用 ssh key 的方式,这样就不用每次输入密码啦。

TOP

本帖最后由 hacker85 于 2014-8-11 09:47 编辑

回复 2# DAIC


    您可能没有理解清楚我的问题,或者是我没有描述清楚,这里我将具体的内容放上来,还请再次指正。
  1. #!/bin/bash
  2. ##################################################
  3. #    This is shell on my PC-Home.Update lwqq and more
  4. ##################################################
  5. str1="当前分支 dev 是最新的。"
  6. str2="当前分支 master 是最新的。"
  7. cd /opt/lwqq/
  8. echo "123456789" | sudo -S git pull --rebase > /tmp/ls.txt
  9. function ChaXun()
  10. {
  11.     awk -F: '{print $1}' /tmp/ls.txt | while read line;do
  12.         if [ "$line" = "$str1" ]; then
  13.             echo "0"
  14.             return 0
  15.         fi
  16.     done
  17.     return 1;
  18. }
  19. result=$(ChaXun)
  20. if [ -n "$result" ]; then
  21.     sudo rm -rf /build > /dev/null
  22.     sudo mkdir /build > /dev/null
  23.     cd build/
  24.     sudo cmake .. &> /dev/null
  25.     sudo make > /dev/null
  26.     sudo make install > /dev/null
  27. fi
  28. function Start()
  29. {
  30.     ps cax | grep $1 > /dev/null
  31.     if [ $? -ne 0 ]; then
  32.         $2 $1 &
  33.     fi
  34. }
  35. sudo rm /tmp/ls.txt
  36. cd
  37. Start pidgin
  38. Start openfetion sudo
复制代码
上方的内容实现了这样的功能——进入lwqq目录,自动传递密码,更新代码文件夹,如果返回结果为str1或者是str2则不需要更新,也不需要再重新编译,如若不然则执行删除build目录操作,并新建之,再重新编译。

有趣的地方在于,使用了两个自定义函数,模块化的结构很明显,可是我只会一次处理一个路径,而我最想处理的效果是——一次自动循环处理N个路径中的代码,并自动根据更新命令后的返回结果来判断是需要重新编译还是不需要,其它的路径为:

cd /opt/pidgin-lwqq/                           ------返回结果为str1的内容则不需要重新编译,否则需要进一步的操作,具体内容与lwqq的要求一样
cd /opt/kwplayer-packages/             ------返回结果为str2的内容则不需要重新编译,否则需要进一步的操作,具体内容为sudo gdebi *.deb,交自动传递参数Y表示同意安装。
cd /opt/bypy/                                        ------返回结果为str2的内容则不需要重新编译,否则需要进一步的操作,具体内容为“提示:软件已更新”,只要终端显示这样一句话就可以了。
cd /opt/bcloud-packages/                 ------返回结果为str2的内容则不需要重新编译,否则需要进一步的操作,具体内容为sudo gdebi *.deb,交自动传递参数Y表示同意安装。
cd /opt/lixian-xunlei/                          ------返回结果为str2的内容则不需要重新编译,否则需要进一步的操作,具体内容为“提示:软件已更新”,只要终端显示这样一句话就可以了。


我上面的描述够详细了,请再次帮忙规划。

TOP

回复 3# hacker85


    你的代码都写出来了,还有什么问题吗?

TOP

回复 4# DAIC


    代码我是写出来了,但是这里涉及到多个目录的转换,我只会写一个目录里的操作,并且这个代码我觉得还不够精练,想请帮忙完善之。

TOP

回复 5# hacker85


    你不是会使用函数吗,把处理一个目录的代码封装成函数。处理其它目录的时候调用函数就行了。

TOP

返回列表