makefile执行shell脚本
‘壹’ makefile中怎么使用SHELL自定义函数
你的意思是在shell是怎么使用自定义函数吧?
下面给你个程序,你一看便知:(耐心看完)
#############################################################
#功能:装载指定目录数据
#作者:PENGWEI
#时间:2015-11-18
#############################################################
# 数据日期参数,待传入
V_DATA_DATE=$1
#FTP完成后数据存放路径
V_DATA_DIR=/home/almusr/data/odsdata/FTP/$V_DATA_DATE
# FTP完成后生成的标志文件所在路径
V_FTP_FLAG=/home/almusr/data/etl_load/FTPOK
# 解压数据前备份数据的存放路径
V_DATA_BAK=/home/almusr/data/odsdata/odsdata_bak
# 配置文件存放路径
V_CFG_DIR=/home/almusr/cfg
#日志文件
LOGDIR=/home/almusr/log/Loaddata_log
LOGFILE=$LOGDIR/LoadData_$V_DATA_DATE.log
# 初始化系统参数
DBNAME=ALMDB
USER=almusr
PASSWORD=almusr
SCHEMA=ODSUSR
#如果 日志目录不存在
if [ ! -d "${LOGDIR}" ]
then
#建立目录
mkdir -p "${LOGDIR}"
fi
#\n --回车
echo "\n日志文件[$LOGFILE]\n"
#日志函数
recordLog()
{
echo `date +"%Y-%m-%d %T"`": $1" | tee -a $LOGFILE
return 0
}
#判断参数个数
if [ $# -ne 1 ]
then
recordLog "Usage:$0 directory"
exit 1
fi
# $?表示上述命令执行后返回的状态(执行成功返回0 执行不成功返回非0)
if [ $? -ne 0 ]
then
recordLog "cd $V_DATA_DIR error !"
exit 1
fi
#连接数据库
db2 connect to $DBNAME user $USER using $PASSWORD
if [ $? -ne 0 ]
then
recordLog "connect[$DBNAME] fail!"
exit 1
fi
#加载数据
RETVAL=0
for i in `cat $V_CFG_DIR/tab_tmp2.cfg`
do
#读取表名并输出
TABLE_NAME=`echo $i | awk -F "," '{print $1}'`
#读取文件后缀名并输出
echo " the table_name is $TABLE_NAME"
#拼接文件名
FILENAME=${TABLE_NAME}.del
#解压缩 临时变量
FILENAME_TMP=$FILENAME.gz
echo "the FILENAME is $FILENAME"
recordLog "the FILENAME $FILENAME!"
# 第一步:对压缩文件备份,先扫描FTP完成标志,如果存在就说明FTP过程已结束,开始备份,否则等待继续扫描
#进去FTP完成标志所在目录
cd $V_FTP_FLAG
#扫描FTP完成标志
if [[ ! -e "${V_DATA_DATE}.ok" ]]; then
sleep 1800
else
cd $V_DATA_BAK
#备份文件
cp -r $V_DATA_DIR ${V_DATA_DATE}_bak
cd ${V_DATA_DATE}_bak
rm -rf ${V_DATA_DATE}
fi
recordLog "Copy data was finished"
# 第二步:删除30天前的备份数据
v_BakFileDate=`date -d "- 30 day ${V_DATA_DATE}" +%Y%m%d`
cd $V_DATA_BAK
rm -rf ${v_BakFileDate}_bak
recordLog "Removed the bak_data of 30 days before!"
# 第三步:对文件进行解压
cd $V_DATA_DIR
if [ -f $FILENAME_TMP ]
then
echo "$FILENAME_TMP must gunzip"
#解压文件
gunzip $FILENAME_TMP
echo "$FILENAME_TMP ,gunzip success"
else
echo "$FILENAME exist,next step"
recordLog "$FILENAME exist,next step!"
fi
# 第四步:数据加载
if [ -f $FILENAME ]
then
# CMD="db2 \"load from $FILENAME of del MODIFIED BY coldel0x23 usedefaults keepblanks decpt. replace into ODSUSR.$TABLE_NAME data buffer 10000\" > $LOGDIR/$TABLE_NAME_XX.log 2>&1"
CMD="db2 \"load from $FILENAME of del replace into ODSUSR.$TABLE_NAME data buffer 10000\" > $LOGDIR/$TABLE_NAME.log 2>&1"
echo "$FILENAME is loading"
eval $CMD
fi
echo "load data is over"
recordLog "load data is over"
# 第五步:判断加载是否正确
#判断是否正常加载
read_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows read" | awk -F'=' '{print $2}'`
skip_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows skipped" | awk -F'=' '{print $2}'`
load_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows loaded" | awk -F'=' '{print $2}'`
reject_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows rejected" | awk -F'=' '{print $2}'`
delete_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows deleted" | awk -F'=' '{print $2}'`
commit_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows committed" | awk -F'=' '{print $2}'`
echo "$read_num,$skip_num,$load_num,$reject_num,$delete_num,$commit_num"
#条件判断加载是否正确
if [[ "$read_num" -eq "$load_num" && "$load_num" -eq "$commit_num" ]]
then
echo "Data loading is perfect!"
else
cat $LOGDIR/$TABLE_NAME.log
recordLog "loading [$V_DATA_DIR/$TABLE_NAME] error!"
RETVAL=1
continue
fi
done
db2 connect reset >/dev/null 2>&1
if [ $RETVAL != 0 ]
then
recordLog "load data directory [$V_DATA_DIR] error!!!"
else
recordLog "load data directory [$V_DATA_DIR] successful!!!"
fi
# 第五步:完成退出
exit 0
你可以把上面这段代码拷贝出来,查看一下recordLog,这是个日志函数,自定义的,其中参数是外部传入的,调用格式也有,好好看看吧,别忘了点赞啊
‘贰’ 关于c代码编译文件makefile的疑问: SHELL = @SHELL@
在使用autoconf工具的时候,才需要写成类似这样@SHELL@的形式
‘叁’ 在一个Makefile中的语句 $(shell pwd)/include/
makefile中,要调用shell脚本。需要特殊的语法。
比如要调用xxx命令。
相应的语法是
$(shell xxx)
你直接使用xxx,比如pwd命令。人家makefile哪知道是shell命令啊。它只会把pwd当成makefile变量或者规则。
‘肆’ linux下makefile文件在target中调用shell脚本,shell脚本定义变量的问题
你应该source 一下你的文件,让你 的内容在父进程中生效
‘伍’ Makefile、shell脚本在哪门课程上学习
说实话,你说的这些任何一块语言都够你学一阵子的。
你最好还是选择性学习,比如你想做什么,干什么,针对性的学。
因为你说的这些基本上互相联系都不大。你还是着重挑一门学吧。
你说的这些有些我也没发言权,我就谈几个我看过的推荐一下
python最近我也在看,基本上是《python语言入门》和《python核心编程》两本串换着看。
shell的话
我建议先看《shell脚本学习指南》或《实战LINUX+SHELL编程与服务器管理》
然后进阶看《高级Bash脚本编程指南》
别的我就无法推荐了
‘陆’ Linux基础中,shell脚本和makefile文件的差别是什么啊,求详细点嘛
你可以认为makefile是shell脚本“派生”出来的。最朴素的makefile可以完全通过gcc等语句实现,在这种情况下也就是shell脚本了。但是为了方便,makefile引入了大量的语法用来使编译链接变得简单,所以和shell脚本还是不同的。
可以参考:http://apps.hi..com/share/detail/31232485
‘柒’ Linux下shell脚本怎么实现运行某个文件的makefile
make工具就知道阿,makefile文件里描述了编译参数等信息
‘捌’ 如何在makefile中以source 来运行一个shell脚本
make -f /Path/to/your/project/Makefile
e.g.
make -f ~/nagios/xxx/src/Makefile