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
#############################################
# @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] }'
呵呵,完毕。