嵌入式Linux shell和makefile基礎

一、shell腳本的運行機制

1、c語言機制:編寫源代碼->編譯連接生成可執行二進制文件;
2、腳本程序機制:編寫好源代碼後即可直接運行,沒有編譯過程;
3、shell程序是解釋運行,所謂解釋運行就是說當我們執行一個shell程序時,shell解析器會逐行的解釋shell程
   序代碼,然後一行一行的去運行。(順序結構)
4、CPU實際只認識二進制代碼,根本不認識源代碼。腳本程序源代碼不是二進制代碼,CPU也不認識,也不能
   直接執行。只不過腳本程序的編譯連接過程不是以腳本程序源代碼爲單位進行的,而是在腳本運行過程中逐行
   的解釋執行時纔會完成腳本程序源代碼轉成二進制的過程。

二、shell編輯器、編譯器、運行方法

1、shell程序是文本格式的,只要是文本編輯器都可以。但是因爲我們的shell是要在Linux系統下運行的,所以換
   行符必須是 '\n' ,而windows下的換行符是 "\r\n" ,因此windows中的編輯器寫的shell不能在Linux下
   運行。所以編輯shell腳本需要用到Linux環境下的編輯器工具。
2、編譯器:不涉及,因爲設立了是解釋性語言,直接編輯完就可以運行。
3、shell程序運行的方式有多鍾,這裏主要介紹三種:
	第一種:./xx.sh,和運行二進制可執行程序方法一樣。這種方式要求shell程序必須具有可執行權限。
		  chmod a+x xx.sh 來添加可執行權限。
	第二種:source xx.sh,source是Linux的一個命令,這個命令就是用來執行腳本程序的。這種方式不需要
		   腳本具有可執行權限。
	第三種:bash xx.sh,bash是一個腳本程序解釋器,本質上是一個可執行程序。這樣執行相當於我們執行了
		 bash程序,然後把 xx.sh 作爲argv[1]傳給他運行(爲什麼不是argv[0],因爲argv[0]是 xx.sh);
4、shell代碼第一行一般都是:#!/bin/sh  以#!開始,後面加上一個pathname,這行話的意思就是制定shell
   程序執行時被哪個解釋器解釋執行。所以我們這裏寫成/bin/sh 意思就是shell文件被當前機器中的/bin目錄下
   的 sh可執行程序執行;在Ubuntu上面默認使用的解釋器sh其實不是bash,而是dash。#號開頭的爲註釋行。

三、shell中變量定義和引用

1、變量的初始化和定義:shell是弱類型語言(強類型語言:語言中的變量如果有明確的類型。反之則爲弱類型語言),
   不需要制定類型,也沒有類型概念。
2、變量賦值,類似於C語言。
3、變量引用,shell中引用一個變量必須使用$符號,$符號就是變量解引用符號。
注意:$符號後面跟一個字符串,這個字符串就會被當作變量去解析,如果該變量未定義,則該變量的值爲空;
注意:變量的引用可以用$var,也可以用${var}。
4、shell中調用Linux命令:a、直接輸入命令執行,b、用反引號(`)括起來執行。如果需要得到Linux命令執行
   後的返回值,我們就需要用反引號括起來執行。

四、shell中的分支結構

1、if語句
if [表達式]; then
	xxx
	yyy
	zzz
else
	xxx
	ddd
	uuu
fi
2、if語句的典型應用
	判斷文件是否存在。(-f),[  ] 裏面前後都有空格,不能省略。
	判斷目錄是否存在     (-d)。
	判斷字符串是否相等("str1" = "str2"),注意是一個等號。
	判斷數字是否相等(-eq)、大於(-gt)、小於(-lt)、大於等於(-ge)、小於等於(-le)。
	判斷字符串是否爲空(-z),注意-z判斷時如果變量本身沒定義會報錯
	
3、for循環
4、while循環
5、echo的創建和追加輸入文件
	a、shell中可以使用echo指令新建一個文件,並且通過 > 符號將指定內容傳入文件中。
	b、可以使用echo指令配合追加符號 >> 向一個已經存在的文件末尾追加輸入內容。
6、shell中的case語句沒有break;
7、調用shell程序可以傳遞參數:
	(1)C語言中可以通過main函數的argc和argv給程序傳參)
	(2)shell程序本身也可以在調用時傳參給他。在shell程序內部使用傳參也是使用的一些特定符號來表示的,
	包括:$#表示調用該shell時傳參的個數。($#計數時只考慮真正的參數個數$0、$1、$2·····則依次表示傳參
	的各個參數。
	C語言:./a.out aa bb cc 	argc = 4, argv[0] = ./a.out, argv[1]是第一個有效參數····
	shell:source a.sh aa bb cc  $# = 3, $0是執行這個shell程序的解析程序的名字,$1是第一個有效
	      參數的值,$2是第2個有效參數的值·····
8、while循環和case語言和傳參結合
	(1)shell中的break關鍵字和C語言中意義相同(都是跳出)但是用法不同。因爲shell中case語句默認不用
	   break的,因此在shell中break只用於循環跳出。所以當while中內嵌case語句時,case中的break是
	   跳出外層的while循環的,不是用來跳出case語句的。
	(2)shell中的$# $1等內置變量的值不是不可變的,而是可以被改變,被shift指令改變。shift指令有點像
	   左移運算符,把我們給shell程序的傳參左移了一個移出去了,原來的$2變成了新的$1,原來的$#少了1個。

五、makefile基礎

1、makefile的作用和意義
	(1)工程項目中c文件太多管理不方便,因此用Makefile來做項目管理,方便編譯鏈接過程。
	(2)uboot和linux kernel本質上都是C語言的項目,都由很多個文件組成,因此都需要通過Makefile來管理。
	   所以要分析uboot必須對Makefile有所瞭解。
2、目標、依賴、命令
	(1)目標就是我們要去make xxx的那個xxx,就是我們最終要生成的東西。
	(2)依賴是用來生成目錄的原材料
	(3)命令就是加工方法,所以make xxx的過程其實就是使用命令將依賴加工成目標的過程。
3、通配符%和Makefile自動推導(規則)
	(1)%符號是Makefile中的通配符,代表一個或幾個字母。也就是說%.o就代表所有以.o爲結尾的文件。
	(2)所謂自動推導其實就是Makefile的規則。當Makefile需要某一個目標時,他會把這個目標去套規則說明,
	   一旦套上了某個規則說明,則Makefile會試圖尋找這個規則中的依賴,如果能找到則會執行這個規則用依
	   賴生成目標。
4、僞目標(.PHONY)
	(1)僞目標意思是這個目標本身不代表一個文件,執行這個目標不是爲了得到某個文件或東西,而是單純爲了執
	   行這個目標下面的命令。
	(2)僞目標一般都沒有依賴,因爲執行僞目標就是爲了執行目標下面的命令。既然一定要執行命令了那就不必加
	   依賴,因爲不加依賴意思就是無條件執行。
	(3)僞目標可以直接寫,不影響使用;但是有時候爲了明確聲明這個目標是僞目標會在僞目標的前面用.PHONY來
	   明確聲明它是僞目標。
5、Makefile中幾種變量賦值運算符
	(1)  = 最簡單的賦值
	(2)  :=	一般也是賦值
	以上這兩個大部分情況下效果是一樣的,但是有時候不一樣。
	用 = 賦值的變量,在被解析時他的值取決於最後一次賦值時的值,所以你看變量引用的值不能只往前面看,還要
	往後面看。
	用 := 來賦值的,則是就地直接解析,只用往前看即可。
	(3) ?=	如果變量前面並沒有賦值過則執行這條賦值,如果前面已經賦值過了則本行被忽略。
	(4) +=  	用來給一個已經賦值的變量接續賦值,意思就是把這次的值加到原來的值的後面,有點類似於strcat。
	(在shell makefile等文件中,可以認爲所有變量都是字符串,+=就相當於給字符串stcat接續內容)(注意
	 一個細節,+=續接的內容和原來的內容之間會自動加一個空格隔開)
6、Makefile的環境變量
	(1)makefile中用export導出的就是環境變量。一般情況下要求環境變量名用大寫,普通變量名用小寫。
	(2)環境變量和普通變量不同,可以這樣理解:環境變量類似於整個工程中所有Makefile之間可以共享的全局變
	   量,而普通變量只是當前本Makefile中使用的局部變量。所以要注意:定義了一個環境變量會影響到工程中
	   別的Makefile文件,因此要小心。
	(3)Makefile中可能有一些環境變量可能是makefile本身自己定義的內部的環境變量或者是當前的執行環境提
	   供的環境變量(譬如我們在make執行時給makefile傳參。make CC=arm-linux-gcc,其實就是給當前
	   Makefile傳了一個環境變量CC,值是arm-linux-gcc。我們在make時給makefile傳的環境變量值優先
	   級最高的,可以覆蓋makefile中的賦值)。這就好像C語言中編譯器預定義的宏__LINE__ __FUNCTION__
	   等一樣。
7、Makefile中使用通配符
	(1) *	 若干個任意字符
	(2)	?	1個任意字符
	(3)	[ ]	將[]中的字符依次去和外面的結合匹配
	還有個%,也是通配符,表示任意多個字符,和*很相似,但是%一般只用於規則描述中,又叫做規則通配符。
8、Makefile的自動變量
	(1)爲什麼使用自動變量。在有些情況下文件集合中文件非常多,描述的時候很麻煩,所以我們Makefile就用一
	   些特殊的符號來替代符合某種條件的文件集,這就形成了自動變量。
	(2)自動變量的含義:預定義的特殊意義的符號。就類似於C語言編譯器中預製的那些宏__FILE__一樣。
	(3)常見自動變量:
	$@		規則的目標文件名
	$<		規則的依賴文件名
	$^		依賴的文件集合
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章