1. 程式人生 > >Makefile和shell指令碼簡單編寫

Makefile和shell指令碼簡單編寫

  1. CROSS =/opt/hisi-linux-nptl/arm-hisiv100-linux/bin/arm-hisiv100-linux-uclibcgnueabi-
  2. #CROSS =
  3. SRCDIRS =./ \
  4. ./include\
  5. ./src\
  6. ./gsoap\
  7. ASFLAGS =
  8. CFLAGS =-Wall
  9. CXXFLAGS =-O2
  10. LDFLAGS =
  11. ARFLAGS =
  12. OCFLAGS =
  13. ODFLAGS =
  14. INCDIRS =-I../include -I../fcCommon -I./gsoap
  15. LIBDIRS =-L../../../lib/../../../lib/libfcMsgClient.a ../../../lib/libfcCommon.a ../../../
    lib/common/libssl.so.1.0.0../../../lib/common/libcrypto.so.1.0.0
  16. LIBS =-lpthread -lm
  17. #
  18. ### You shouldn't need to change anything below this point.
  19. #
  20. ##
  21. #AS = $(CROSS)as
  22. CC = $(CROSS)gcc
  23. CXX = $(CROSS)g++
  24. LD = $(CROSS)gcc
  25. AR = $(CROSS)ar
  26. OC = $(CROSS)objcopy
  27. OD = $(CROSS)objdump
  28. ST = $(CROSS)strip
  29. RM =-rm -fr
  30. #notdir 會取出當前目錄的目錄名
  31. NAME := $(notdir $(CURDIR))
  32. #foreach 遞迴取出所有的檔案
  33. SFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.s))
  34. CFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c))
  35. CPPFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.cpp))
  36. RMFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*~))
  37. RMFILEO := $(foreach dir
    ,$(SRCDIRS),$(wildcard $(dir)/*.o))
  38. #$(SFILES:.s=.o) 將所有的.s檔案轉換成.o檔案
  39. OBJS := $(SFILES:.s=.o) $(CFILES:.c=.o) $(CPPFILES:.cpp=.o)
  40. DEPS := $(OBJS:.o=.d)
  41. VPATH := $(SRCDIRS)
  42. #建一個虛擬的目標
  43. .PHONY: all rebuild clean
  44. all:
  45. @$(MAKE) $(NAME)
  46. rebuild:
  47. @$(MAKE) clean
  48. @$(MAKE) $(NAME)
  49. $(NAME): $(OBJS)
  50. @echo test linking ...
  51. # $(LD) $(LDFLAGS) $(LIBDIRS) -o [email protected] $^ $(LIBS)
  52. # $(LD) $(LDFLAGS) -o [email protected] $^ $(LIBS) $(LIBDIRS)
  53. $(CXX) $(LDFLAGS)-o fcOnvif -DWITH_PURE_VIRTUAL $^ $(LIBS) $(LIBDIRS)
  54. $(ST)-g --strip-unneeded fcOnvif
  55. cp fcOnvif /mnt/nfs
  56. # cp armok /tftpboot/
  57. #把當前所有依賴的.s檔案編譯成.o檔案
  58. %.o:%.s
  59. @echo assembling $<...
  60. $(AS) $(ASFLAGS) $(INCDIRS) $<-o [email protected]
  61. %.o:%.c
  62. @echo test compiling $<...
  63. $(CC) $(CFLAGS) $(INCDIRS)-c $<-o [email protected]
  64. %.o:%.cpp
  65. @echo compiling $<...
  66. $(CXX)-DWITH_PURE_VIRTUAL $(CXXFLAGS) $(INCDIRS)-c $<-o [email protected]
  67. %.d:%.c
  68. @$(CC) $(CFLAGS) $(INCDIRS)-MM $^-o [email protected].tmp
  69. @sed's,$(basename $(notdir [email protected])).o[ :]*,$(@:.d=.o) [email protected] : ,g' [email protected].tmp > [email protected]
  70. @$(RM) [email protected].tmp
  71. %.d:%.cpp
  72. @$(CXX) $(CXXFLAGS) $(INCDIRS)-MM $^-o [email protected].tmp
  73. @sed's,$(basename $(notdir [email protected])).o[ :]*,$(@:.d=.o) [email protected] : ,g' [email protected].tmp > [email protected]
  74. @$(RM) [email protected].tmp
  75. ifeq (mach/mach,)
  76. -include $(DEPS)
  77. endif
  78. clean:
  79. @$(RM) $(OBJS) $(DEPS) $(NAME) $(RMFILES) $(RMFILEO)
  80. @echo clean completed
[email protected]目標檔案,$^--所有的依賴檔案,$<--第一個依賴檔案。
1、wildcard : 擴充套件萬用字元
2、notdir : 去除路徑
3、patsubst :替換萬用字元
  1. 例子:
  2. 建立一個測試目錄,在測試目錄下建立一個名為sub的子目錄
  3. $ mkdir test
  4. $ cd test
  5. $ mkdir sub
  6. test下,建立a.cb.c2個檔案,在sub目錄下,建立sa.csb.c2 個檔案
  7. 建立一個簡單的Makefile
  8. src=$(wildcard *.c ./sub/*.c)
  9. dir=$(notdir $(src))
  10. obj=$(patsubst %.c,%.o,$(dir))
  11. all:
  12. @echo $(src)
  13. @echo $(dir)
  14. @echo $(obj)
  15. @echo"end"
  16. 執行結果分析:
  17. 第一行輸出:
  18. a.c b.c ./sub/sa.c ./sub/sb.c
  19. wildcard指定目錄././sub/下的所有後綴是c的檔案全部展開。
  20. 第二行輸出:
  21. a.c b.c sa.c sb.c
  22. notdir把展開的檔案去除掉路徑資訊
  23. 第三行輸出:
  24. a.o b.o sa.o sb.o
自動化變數$?代表依賴檔案列表中被改變過的所有檔案。
自動化變數$^代表所有通過目錄搜尋得到的依賴檔案的完整路徑名(目錄 + 一般檔名)列表。
自動化變數[email protected]代表規則的目標。
自動化變數$<代表規則中通過目錄搜尋得到的依賴檔案列表的第一個依賴檔案。
自動化變數$(@D) 
The directory part of the file name of the target, 
with the trailing slash removed. If the value of ‘[email protected]’ is dir/foo.o 
then ‘$(@D)’ is dir. This value is . if ‘[email protected]’ does not contain a slash.
(目標檔名的目錄部分,
並刪除尾部斜槓。 如果'$ @'的值是dir / foo.o
那麼'$(@ D)'是dir。 此值為。 如果'$ @'不包含斜槓。)
自動化變數$(@F)
The file-within-directory part of the file name of 
the target. If the value of ‘[email protected]’ is dir/foo.o then ‘$(@F)’ is foo.o. 
‘$(@F)’ is equivalent to ‘$(notdir [email protected])’.
(檔案內目錄部分的檔名為目標。 如果'$ @'的值是dir / foo.o,那麼'$(@ F)'是foo.o。
'$(@ F)'相當於'$(notdir $ @)'。) 
來源: http://blog.chinaunix.net/uid-20564848-id-217918.html
Linux shell 下迴圈讀取檔案test.txt的方式。(3種)
  1. #!/bin/bash
  2. printf "*************************************\n"
  3. echo " cat file whiel read line"
  4. cat test.txt |while read line
  5. do
  6. echo $line;
  7. done
  8. printf "*************************************\n"
  9. echo "while read line <file"
  10. while read line
  11. do
  12. echo $line;
  13. done<test.txt
  14. printf "*************************************\n"
  15. echo "for line in cat test.txt"
  16. SAVEIFS=$IFS
  17. IFS=$(echo -en "\n")
  18. for line in $(cat test.txt)
  19. do
  20. echo $line;
  21. done
  22. IFS=$SAVEIFS  
  23. 注意:for line in $(cat test.txt)   當檔案中有空格或者tab 時,一定要設定一下IFS變數。


相關推薦

Makefileshell指令碼簡單編寫

CROSS =/opt/hisi-linux-nptl/arm-hisiv100-linux/bin/arm-hisiv100-linux-uclibcgnueabi-#CROSS =SRCDIRS =./ \./include\./src\./gsoap\ASFLAGS =CFLAGS =-WallCX

Liunx----Shell指令碼簡單介紹 Shell執行環境Shell變數

Shell 指令碼(shell script),是一種為 shell 編寫的指令碼程式。 Shell 程式設計跟 java、php 程式設計一樣,只要有一個能編寫程式碼的文字編輯器和一個能解釋執行的指令碼直譯器就可以了。 Linux 的 Shell 種類眾多,常見的有: Bourne Shell(

三個簡單shell指令碼編寫

 Linux練習內容: 1.編寫shell指令碼,利用陣列存放3個字串,再利用for迴圈將它們顯示在螢幕上。 陣列不需要定義,下標從0開始,直接賦值即可,這樣賦值:arr[0]=zb 2.編寫shell指令碼,利用cat命令顯示指定目錄下的多個指定檔案,指令碼的第一個引數指

SHELL指令碼簡單的賦值與遞增

Count=`expr $Count + 1`;#可以在各種shell執行,其他類C的寫法只能在指定的bash版本執行; 賦值不能帶$, 帶$相當於字串常量了;執行指令碼參考如下 #!/bin/sh Count=1; while [ 1 -lt 2 ] do Count=`expr $Count

Linux的基礎命令Shell指令碼

一、計算機   1、能接收使用者輸入的指令和資料,經過中央處理器的算術邏輯單元處理,然後會產生或者顯示新資料的,就是計算機。    比如,普通商戶用的計算器,手機,提款機,汽車導航,桌面電腦,手提電腦等   2、計算機

linuxshell指令碼常用命令技巧

date :調配時間,可以用date命令完成很多需求,比如日誌資料夾,比如求前幾天等等,其他常用方法百度 date "+%Y%m%d" #輸出年月日 date -d last-day +%Y%m%d #輸出當然日期的前一天 #########################

Makefileshell指令碼區別

在Makefile可以呼叫shell指令碼,但是Makefile和shell指令碼是不同的。本文試著歸納一下Makefile和shell指令碼的不同。 1、 shell中所有引用以$打頭的變數其後要加{},而在Makefile中的變數是以$打頭的後加()。例項如下: Make

shell指令碼----簡單日記系統

#b.sh 首頁(登入介面): echo "------->haha<-------"; echo " 1、登入"; echo " 2、註冊"; echo " 3、退出"; echo read -p "" a; case "$a" in 1)

正則表示式Shell指令碼

正則表示式分兩類:基本正則表示式:BRE擴充套件正則表示式:EREgrep -E, egrep正則表示式引擎:採用不同演算法,檢查處理正則表示式的軟體模組PCRE元字元分類:字元匹配、匹配次數、位置錨定、分組 基本正則表示式元字元字元匹配:. 匹配任意單個字元[] 匹配指定範圍內的任意單個字元,示例:[wa

Shell指令碼簡單練習

一次Linux Shell指令碼的簡單練習 一名熱心的同事提出: 每天凌晨建立20個以“xyz_”開頭的使用者並建立密碼(不允許登陸),再生成一個一鍵刪除這些使用者的指令碼。 大概思路 建立使用者生成指令碼,crontab定時任務每天凌晨

linux中使用corntabshell指令碼自動備份nginx日誌,按天備份

編寫shell指令碼,實現nginx日誌每天自動備份到指定資料夾! 需要的命令mv , corntab -e(定時任務),shell指令碼 這裡先說一下corntab:  https://www.cnblogs.com/longjshz/p/5779215.html  這裡有一篇詳細

Shell程式設計-自定義函式shell指令碼除錯

1.自定義函式函式代表著一個或一組命令的集合,表示一個功能模組,常用於模組化程式設計一下是關於函式的重要說明    在shell中,函式必須先定義,再呼叫    使用 return value來獲取函式的返回值    函式在當前shell中執行,可以使用指令碼中的變數函式的格

鳥哥私房菜shellshell指令碼總結(僅自己看)

1、  cat 顯示內容,和echo寫入區別 2、  $0 為返回值 3、  &後臺執行命令,例子:程式名& 4、  echo 後邊什麼也不接當做回車使用 5、  bash是shell的一種。 6、  不打#!/bin/sh 將不能使用內建命令 7、  ec

pythonshell指令碼:微信企業號傳送資訊

#!/usr/bin/python # coding: utf-8 import urllib,urllib2 import json import sys def gettoken(corpid,corpsecret): gettoken_url = 'https://qyapi.wei

linux常用命令 shell指令碼(必知)

從工作中總結了一些非常實用的linux命令如下: 命令例項 功能 curl -I http://127.0.0.1:8088/index.jsp curl -I  http://127.0.0.1:8088/index.jsp 返回200確認服務正常 sudo mv hea

shellshell指令碼的區別

程式必須以下面的行開始(必須方在檔案的第一行):#!/bin/sh符號#!用來告訴系統它後面的引數是用來執行該檔案的程式。在這個例子中我們使用/bin/sh來執行程式。當編輯好指令碼時,如果要執行該指令碼,還必須使其可執行。要使指令碼可執行:編譯 chmod +x filename 這樣才能用./filena

shell指令碼 簡單的從命令列讀取引數

$# 是傳給指令碼的引數個數 $0 是指令碼本身的名字 $1是傳遞給該shell指令碼的第一個引數 $2是傳遞給該shell指令碼的第二個引數 [email protected] 是傳

shell 指令碼簡單語法

其實是三條命令,if [ -f ~/.bashrc ]是第一條,then . ~/.bashrc是第二條,fi是第三條。如果兩條命令寫在同一行則需要用;號隔開,一行只寫一條命令就不需要寫;號了,另外,then後面有換行,但這條命令沒寫完,Shell會自動續行,把下一行接在then後面當作一條命令處理。和[命令

mongodb資料庫備份利用shell指令碼編寫

1、指令備份 MongoDB提供了備份工具,mongodump.exe,在bin目錄下,其用法如下: mongodump.exe-hlocalhost-ddatabase_name -u use

linux動態庫及靜態庫的製作 makefile簡單編寫

一.庫什麼是庫,簡單的可以說是可執行程式碼的二進位制形式,能夠被作業系統載入記憶體執行。作業系統的不同,二者的庫也是不相容的,如windows與linux.庫又分為靜態庫和動態庫,動態庫又稱為共享庫。linux下靜態庫(.a)檔案,動態庫(.so)檔案。主要存放函式庫的路徑有