bourne shell不支持数组,c shell korn shell,bash都支持,就bourne shell不支持 , NND,可恨的是

我在chinaunix.com翻了一下午的帖子,翻了一下午的 unix shell编程指南(32章pdf格式的那个,巨全)。

最终在一个兄弟的指点下,查.profile,发现自己用的正是bourne shell.靠。

花了这么长的时间啊,我实在是太菜了,没办法。

头晕,这两天觉都没睡好,我已经强迫自己早点睡了。可是还是tmd睡不好。

不过,睁着涩涩的眼睛,我还是把变通的办法给摸出了一个。

怎么读配置文件?

程序是定时执行的,每隔一小时。一般的做法是定时用crontab控制。我同事就是这么写的(他vi用的很熟)。我不会用,而且也觉得这个备份数据的脚本可以本身实现定时控制。就是一个while死循环+个sleep不就好了嘛。呵呵。

要求:

定时将数据表备份到 bak表里去。

数据表写到配置文件里,一共若干数据表,定时分为每小时,每月,每天,每周,每年,5种。也写进配置文件。一个配置文件像这样。

host   user   pass   table   baktable   type

若干行。

本来,在while循环里读配置文件就好了。

不过是最多每小时读一次而已。可是我不要这么做,我要它就在启动的时候读一次配置文件。

这就麻烦了,得把N行配置的数据存进变量里。如果有数组,那么就好办了。

数组套数组,就是所谓的2维了,套下去还可以多维。

bourne shell没有数组,那么怎么办啊,怎么把变量存起来呢?顺序,序号都对应?

用eval,加上一个自增的序号变量。呵呵eval阿。还好我以前有过php和js类似的经验。

即把arr[1],arr[2] ...表示为 arr1,arr2,....

cfg.ini

#Host    User    Password    Table     BakTable    Type    
localhost alamutu smoldfdssd test.send_smc_dx test.send_smc_dx_bak0 0
localhost alamutu smoldfdssd test.send_smc_dx test.send_smc_dx_bak1 1
localhost alamutu smoldfdssd test.send_smc_dx test.send_smc_dx_bak2 2
localhost alamutu smoldfdssd test.send_smc_dx test.send_smc_dx_bak3 3
localhost alamutu smoldfdssd test.send_smc_dx test.send_smc_dx_bak4 4

localhost alamutu smoldfdssd test.send_smc_dx test.send_smc_dx_bak01 0
localhost alamutu smoldfdssd test.send_smc_dx test.send_smc_dx_bak02 0


 



mysqlbk.sh

#! /bin/sh
#
############################################
#
    @author     bailing    
#
  @date    2006-07-14
#
  @descrip    mysql table backup
#
  @example    Mysqlbk.sh    0
#
    @env     FreeBSD    bourne shell
#
############################################

#设置日志位置
LogFile="/log/MysqlTableBk.log"

#检查参数合法性
if [ $# -ne 1 ] ; then
    echo "please enter type :[ 0 | 1 | 2 | 3 | 4 ]"
    
exit
fi

case $1    in
0)
;;
1)
;;
2)
;;
3)
;;
4)
;;
*)
echo "type select error , valid type is [ 0 | 1 | 2 | 3 | 4 ] ,ex: Mysqlbk.sh    0"
exit
;;
esac

#0 , 小时; 1 , 天 ; 2 , 周 ; 3 , 月; 4 , 年;
#
Host    User    Password    Table     BakTable    Type    
MysqlTableBk()
{
echo $LogFile
d
=`date "+%Y-%m-%d_%H:%M:%S"`
echo "$d mysql  -h$1 -u$2 -p$3    $4 $5" >>$LogFile
#mysql  -h$1 -u$2 -p$3<<!
#
select * from $4 limit 1;
#
Insert into $5 select * from $4;
#
quit
#
!
}


######./bk.sh "0"
#
读取配置文件进变量 Host1 , Host2 ,  , HostN. User1 , User2 ,  , Usern , 
i="1"
while read Host    User    Password    Table     BakTable    Type
do
    
#echo $i
    if [ "$Host" != "" ] && [ "$Type" = "$1" ] ; then
        nHost
=Host$i
        nUser
=User$i
        nPassword
=Password$i
        nTable
=Table$i
        nBakTable
=BakTable$i
        nType
=Type$i
        
eval "$nHost=\"$Host\""
        
eval "$nUser=\"$User\""
        
eval "$nPassword=\"$Password\""
        
eval "$nTable=\"$Table\""
        
eval "$nBakTable=\"$BakTable\""
        
eval "$nType=\"$Type\""
        
#eval "echo \$$nHost    \$$nUser \$$nPassword     \$$nTable    \$$nBakTable    \$$nType"
        i=`expr $i + 1`
    
else
        
echo "empty line"
    fi
done  <cfg.ini

#正式循环处理。
while true
do

    j
="1"
    
while [ $j -lt $i ]
    
do 
        
echo $j
        nHost
=Host$j
        nUser
=User$j
        nPassword
=Password$j
        nTable
=Table$j
        nBakTable
=BakTable$j
        nType
=Type$j
        
eval "MysqlTableBk \$$nHost     \$$nUser \$$nPassword \$$nTable \$$nBakTable \$$nType"
        j
=`expr $j + 1`
    
done

    
case $1    in
    
0)
        
echo 3600
        ;;
    
1)
        
echo 86400
        ;;
    
2)
        
echo 86400*7
        ;;
    
3)
        
echo 86400*30
        ;;
    
4)
        
echo 86400*365
        ;;
    esac
    
sleep 10
    
#exit

done

#awk 'BEGIN{str="jiu#ssd#rty#oop";print split(str,arr,"#"); print arr[2] }'



呵呵,完毕。
Posted on 2006-07-13 23:11  古代  阅读(1135)  评论(2编辑  收藏  举报