首页 > 代码库 > 回忆曾经写过的第一个Bash脚本
回忆曾经写过的第一个Bash脚本
这盘文章,算是杂谈吧,想谈谈我对于Linux操作系统的灵魂之笔 Bash的理解。
据说Shell脚本有50种之多(陈皓老师的酷壳网上有一篇博文 http://coolshell.cn/articles/8619.html 提到),现在,用Linux调试大大小小程序,除了使用Makefile,偶尔用用CMakeList.txt, 更多程序是用bash 脚本来实现半自动化调试,就像在VS下面,每次修改重新编译一样,你总是 gcc 或者 g++,然后 ./test 运行,然后再看看有没有错,编译出错又得修改, rm -rf test, 很是繁琐,如果 一个小巧的脚本 test.sh 即可搞定:
#!/bin/bash gcc -o test -g test.c if [ -e test ];then ./test rm test fi
这样,你只要每次执行脚本 sh test.sh 即可调试程序,如果出错直接vim 或 gedit 修改即可。
关于更直白的应用,可参见我之前写的一篇文章,上面有 Shell脚本,Makefile在Linux环境下安装编译和调试程序的示例,诚然,你用gdb调试 那是更深入的话题了。
啰嗦了这么多,还是切入主题吧,即我当年在工作中的第一个使用的脚本,即将主板上系统中的相关文件进行解压更新,亦或是系统的版本更新,但这个第一次使用的Shell脚本存在很多不足之处:
1. 缺乏必要的脚本使用说明部分,如输入命令 sh test.sh, 若是需要参数,就需要加入必要的判断:
if [ $# -ne 1 ];then
echo "Usage: ......"
fi
2. 变量名风格不统一,按照我现在的思维,目录的变量名最好都大写,而其他变量名小写,不过最好是单词
3. 没有命令执行错误 输出到log 的习惯,其实在一些重要命令 执行后,加上 >error.log 2>&1 可以帮助分析,也可以写个脚本来对error.log 进行自动化分析。
总之能,本篇杂谈也就是感慨一下第一个用于工作的脚本是多么的拙劣,不过,人总是在进步,所以 生活也因勤奋好学而精彩~
共勉!!!
#! /bin/bash # By GuJinjin # 2010/08/11 # Define Path Variables cm_DIR=/export/bta/canmore fs_DIR=/export/bta/canmore/fsroot host_DIR=/export/host sdks_DIR=/mnt/bta/sdks # define variable b1=cm b2=sdv b3=gvl # cleanup fsroot rm -rf $fs_DIR/* # Update fsroot # $1 is the name of archive # $2 is the build number tar -zxvf $host_DIR/$1 -C $fs_DIR/ # Update oflash cp -rf $sdks_DIR/oflash $fs_DIR/ echo "********** cp oflash successfully ! **********" # Update redboot_flash_nor.bin or redboot.bin if [ -e $sdks_DIR/$2/redboot_flash_nor.bin ];then cp -rf $sdks_DIR/$2/redboot_flash_nor.bin $fs_DIR echo "********** cp redboot_flash_nor.bin successfully ! ********** " elif [ -e $sdks_DIR/$2/redboot.bin ];then cp $sdks_DIR/$2/redboot.bin $fs_DIR/redboot_flash_nor.bin echo "********** cp redboot.bin successfully ! ********** " else echo "********** ERROR ! ********** No such a related file! ********** " fi # Update cefdk,config for cm, sdv & gvl if [ "$3" = "$b1" ];then cp -rf $sdks_DIR/conf.canmore $fs_DIR/ cp -rf $sdks_DIR/$2/gen3.bin $fs_DIR echo "********** cp conf.canmore successfully ! ********** " elif [ "$3" = "$b2" ];then cp -rf $sdks_DIR/conf.sodaville $fs_DIR cp -rf $sdks_DIR/$2/gen4.bin $fs_DIR echo "********** cp conf.sodaville successfully ! ********** " elif [ "$3" = "$b3" ];then cp -rf $sdks_DIR/conf.groveland $fs_DIR/ cp -rf $sdks_DIR/$2/gen4.5.bin $fs_DIR echo "********** cp conf.groveland successfully ! ********** " else echo "********** Error Input parameters ! **********" fi # Update 101,102,103 for sdv or cm if [ "$4" = "3" ];then cp -rf $sdks_DIR/$2/bzImage /tftpboot/101 cp -rf $sdks_DIR/$2/bzImage /tftpboot/102 cp -rf $sdks_DIR/$2/bzImage /tftpboot/103 rm -rf $cm_DIR/fsroot10* cp -rf $cm_DIR/fsroot $cm_DIR/fsroot101 cp -rf $cm_DIR/fsroot $cm_DIR/fsroot102 cp -rf $cm_DIR/fsroot $cm_DIR/fsroot103 echo "********** cp bzImage fsroot10* for 101,102,103 successfully ! **********" elif [ "$4" = "2" ];then cp -rf $sdks_DIR/$2/bzImage /tftpboot/101 cp -rf $sdks_DIR/$2/bzImage /tftpboot/102 rm -rf $cm_DIR/fsroot101 rm -rf $cm_DIR/fsroot102 cp -rf $cm_DIR/fsroot $cm_DIR/fsroot101 cp -rf $cm_DIR/fsroot $cm_DIR/fsroot102 echo "********** cp bzImage fsroot10* for 101,102 successfully ! **********" elif [ "$4" = "1" ];then cp -rf $sdks_DIR/$2/bzImage /tftpboot/103 rm -rf $cm_DIR/fsroot103 cp -rf $cm_DIR/fsroot $cm_DIR/fsroot103 echo "*********** cp bzImage fsroot10* for 103 successfully ! **********" else echo "********** Error Input parameters ! **********" fi echo "******************** Completed ! ********************"