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