首页 > 代码库 > 回忆曾经写过的第一个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 ! ********************"