補基礎shell和makefile





shell介紹:操做系統終端的命令行linux

shell能夠理解爲,軟件系統提供給用戶操做的命令行界面。人機交互的一種方式shell

咱們可使用shell對操做系統和uboot等軟件系統進行交互。bash

shell腳本的運行機制:解釋運行的編輯器

shell用源代碼編寫好後,源代碼能夠直接運行,不像C要進行編譯連接。ide

shell腳本中的程序是解釋運行的,意思就是咱們的源碼編寫好後,在運行時,咱們的shell解析器就會一行一行的對shell源碼進行解釋,而且逐行的運行,就是逐行解釋運行。oop

也就是說shell腳本語言不像是咱們的C語言,寫完源代碼後,要進行編譯連接成二進制的可執行程序,完了在運行學習

腳本語言是在咱們編寫好源碼後,去運行這個腳本的時候,也就是運行這個源碼的時候,逐行的將咱們的腳本源碼轉成二進制程序去給咱們的CPU運行。ui


本身寫一個shellspa

一、咱們的shell是在linux下進行直接運行的,不像是C語言,能夠在Windows下進行編寫,完了以後通過Linux的gcc編譯器通過處理,會直接變成了二進制程序去運行,咱們的shell是直接在linux下直接運行的,編寫好後,直接運行,因此若是咱們在Windows中的文本去編寫shell的話,是不能夠直接在linux下運行的,由於在Linux中,換行符'\操作系統

n',而在Windows中換行符是'\r\n'。因此這個shell的編寫咱們不能在Windows下的編輯器去寫,要在linux下的編輯器去寫。

二、shell程序運行的方法:

比較經常使用的,第一種:./xx.sh 和咱們運行可執行程序很像,可是這種方法去運行,要求這個shell程序必須有可執行權限去運行。

第二種:source xx.sh  source是linux下的一個命令,執行腳本程序的命令,這樣去作就不須要咱們shell腳本須要有可執行的權限

第三種:bash xx.sh bash是一個shell的解釋器,就至關於bash是linux下的一個可執行程序,這個可執行程序直接解釋運行了.sh那個文件

三、寫一個hello word 

第一行的#!/bin/sh 意思就是說,咱們這個腳本文件,未來是從#!開始後面的,用/bin下的sh程序執行的。

echo是linux下的一個命令就是打印的意思。

四、shell腳本其實就是一個把咱們命令行下輸入(鍵入的命令),寫到了shell中變成了shell中的程序,執行shell去作。因此shell就是爲了方便咱們,咱們能夠不用在命令行下手工去輸入,屢次要重複作的事情,能夠直接經過shell簡化咱們的操做。

shell是弱類型語言,就是變量的定義沒有明確的類型,在shell中,變量沒有類型。

因此shell中,

變量的定義是沒有類型的,能夠初始化,好比定義一個變量string並初始化,string="hello word"就是定義了一個string變量,而且初始化爲hello word。在shell中等號賦值的兩邊是不能有空格的。

變量的賦值就是跟C同樣賦值。

變量的引用,要用$符號去引用。$符號就變量解引用符號。

注意:在使用$符號時,$符號後面的字符串會被解析成一個變量,並對這個變量去解析,若是後面的字符串是沒有定義賦值的,那麼去解析這個沒有定義並賦值的變量,就會被解析成,賦值爲空的變量,引用時會打印空。

shell中,使用字符串能夠不加雙引號,可是若是不加雙引號的缺陷就是,不能輸出"或者轉義字符。

加單引號就是直接字面所有輸出,不會替換。

加雙引號,若是雙引號中有轉移字符(\" \$ )等,則輸出的內容中,會將轉義字符進行轉義,變成" $符號

反引號,引發來的部分表示linux中的命令,咱們給變量賦值時,有的時候想給變量賦的值是執行linux命令的返回值

如:PWD=`pwd` , 雙引號中能夠包含反引號MYPATH="`pwd`\include" 將當前的絕對路徑的賦值給MYPATH

shell中的if判斷結構

典型基本的咱們能用到的if語句格式

if [表達式]; then

xxx

else

xxx

fi

這個的格式就是這樣,其實和C的差很少,; then 是格式固定的 fi 是if的結束語


一、判斷一個文件a.txt是否存在,-f

if [ -f a.txt ] -f 就是判斷一個文件是否存在,存在則成立。  

二、判斷一個目錄是否存在, -d

三、判斷字符串是否相等"str1" = "str2"

四、判斷數字是否相等(-eq)、大於(-gt)、小於(-lt)、大於等於(-ge)、小於等於(-le)

五、判斷字符串是否爲空(-z

六、if語句中使用-o表示邏輯或

七、邏輯&&和邏輯或||在shell中,能夠簡寫if判斷式

[ -z $str ] || echo "yes"  意思就是if判斷的簡寫,若是str爲空,則成立,就不會執行邏輯或||後面的語句,若是str不爲空,則不成立,則執行邏輯或||後面的語句。就跟C語言中的邏輯或||同樣,若是if表達式中的||邏輯符號前面的成立了,則不用執行||後面的了,若是||前面的不成立則執行||後面的

[ -f a.txt ] && touch b.txt  若是a.txt文件存在,則建立不b.txt


shell中的循環結構:

for循環格式

for i in 1 2 3 4 5 xxx   (in 後面的東西能夠是數字,字符)

do

echo $i

done

while循環格式 打印1到10

i=1

j=11

while [ $i -lt $j ]; do

echo $i

i=$(($i+1))

done

echo建立一個文件,而且追加輸入文件

>xx.txt建立一個文件xx.txt

>>xxx.txt在這個文件xxx.txt中,追加內容

echo "text" > a.txt 建立一個文件a.txt,而且將text輸入到a.txt

echo "zhuijia" >> a.txt 在a.txt文件中追加zhuijia內容進去。




調用shell程序的傳參

$#表示調用shell程序時,給shell傳參的個數

$0、$一、$二、$3......依次表示傳參的各個參數


在C語言中,咱們argc是傳參的個數,這個傳參的個數包括./a.out

在shell中,咱們$#表示給shell傳遞的參數個數,可是這個個數不包括 source loop.sh 

在C語言中,咱們的argv[0]中的參數表示./a.out argv[1]參數表示./a.out 後面的那個參數,以此類推

在shell中,咱們$0表示執行咱們這個shell的解析可執行程序的名字

$1表示咱們第一個有效參數,以後以此類推

shell中的$# $1等內置的變量,不只能夠被咱們來傳不一樣的參進去進行改變,也能夠經過shift這個指令來改變,shift一次就可讓咱們參數$1 $2 $3等,左移掉一個,使得$#的值少一,原先$1的值被移走了,如今的$2值變成了原先的$1值了。




2、Makefile 

目標、依賴、命令

目標就是咱們最終要生成的東西。

依賴是用來生成 目標的原材料

命令就是加工方法

因此make的過程就是將咱們依賴加工成目標的過程

通配符%和makefile自動推導(規則)

%在makefile中是通配符,意思就是表明一個或者多個字符,%.o 意思就是表明全部的.o文件

咱們make xxx(咱們的目標時)或者make,makefile的規則就開始了,首先會去看這個目標的依賴,存在不存在,若是不存在就會把這個依賴做爲目標去找這個依賴的依賴,若是找到了這個依賴的依賴就會去執行的這個依賴的依賴的命令,將咱們的這個依賴的依賴加工成依賴的目標,這時最開始的目標就能找到這個依賴了,就能夠進行用命令將這個依賴加工成目標了。

好比 led.bin:led.o 

命令

%.o: %.S

命令

上面的led.bin就是咱們make的目標,led.o就是最開始目標的依賴,結果在當前的目錄下找不到這個依賴,就又會把這個依賴做爲目標,%.o把變成了這個依賴的目標,這個目標又去看他的依賴存在不存在,發如今當前的目錄下找了.S結尾的文件,就會執行這個依賴的命令,將這個依賴用命令加工成.o文件,這樣咱們的led.bin這個目標就找到了他的依賴了,就能夠執行命令,將led.o這個依賴加工成led.bin這個目標

makefile中定義變量和使用變量

makefile中定義變量、使用變量,和咱們的shell腳本中是類型的,由於變量都是沒有類型的,變量的引用時也是用$去引用。

僞目標(.PHONY)

僞目標的意思就是,我不生成這個目標,這個目標不是一個文件或者其餘東西,可是咱們想要執行這個目標下的命令,僞目標是沒有依賴的,由於我只想執行這個僞目標的命令,makefile中,clean就是一個僞目標。

爲了聲明這個目標是一個僞目標,讓別人一眼就知道,因此一般會用.PHONY去聲明這些僞目標,如:

.PHONY clean (聲明clean是一個僞目標)

clean

rm *.o *.elf *.bin 


makefile中引用makefile(include 指令)

由於當工程很大的時候,可能須要寫好幾個makefile,因此咱們須要在主的makefile中去引用其餘的makefile,引用方法就是用include的指令,這個指令就是原地展開的意思,跟咱們C語言中的#include預處理階段的工做任務同樣,將包含的東西原地展開

makefile的補充學習:

一、makefile中註釋用#

二、命令前面的@用來靜默執行

makefile的命令行中前面的@表示靜默執行

什麼意思呢,makefile在默認的狀況下,makefile執行命令的時候,是先把這行命令給打印出來,完了以後在去執行這行命令。若是你不想看到這行命令,直接去執行這行命令,就能夠在這行命令前面加@,靜默執行就能夠了

三、makefile中的幾種變量賦值運算符

(1)?= 意思就是若是前面的變量沒有被賦過值了,就執行這條賦值

(2)+= 意思是用來給一個已經被賦值的變量,用來接續賦值

(3)= 最簡單的賦值

(4):= 通常狀況下也是賦值

以上這兩個,在大部分的狀況下,都是同樣的。可是有些狀況下是不同的。

= 在賦值一個變量的時候,我在$解析這個變量的時候,解析出來的這個變量的值是最後一次用=號賦值給這個變量的值,不是說是解析這個變量的值,必定是上面出現的=賦值給的值,要向後面看看有沒有用=號再次給這個變量賦值,若是後面有的話,哪怕解析這個變量是前面,解析的值也會是後面的值

:= 來賦值變量的時候並解析的時候,就是這個變量前面所賦值的值,與後面在給這個變量賦值無關了。

當咱們解析一個變量的時候,咱們就看這個變量的被賦值的時候用的是:= 仍是= 若是用的是:=則就往前面看這個變量最後一次被賦值的值,若是是= 就要日後看這一個變量最後一次被賦值的值

makefile中的環境變量

makefile中環境變量就是用export導出的普通變量,通常環境變量在makefile中都是大寫的,普通變量是用小寫的。

環境變量和普通變量的區別在makefile中,在makefile中,環境變量是被export導出的叫作環境變量,它是能夠被整個工程中的makefile共享的變量,而普通變量只是在當前的makefile中能夠被使用。

makefile中還有一些環境變量是咱們在執行環境下給傳進去的環境變量,咱們能夠在make的時候帶上參數

make CC=arm-linux-gcc 這樣可讓makefile裏面CC這個變量的值變成咱們此次make時給的參數的值。

makefile的補充學習2:

makefile中使用通配符

* 任意個字符

? 一個字符

[] 將其中的內容依次的去和咱們外面的進行匹配。

% 也是表明任意個字符,不一樣的是,%只用在規則描述中,,因此又叫規則通配符

%.o : %.S 這就是規則描述

arm-linux-gcc -o $@ $< -c -nostdlib

makefile中的自動變量

經常使用的自動變量

$@ 表示規則的目標文件名 

$> 規則的依賴文件名

$^依賴的文件集合

相關文章
相關標籤/搜索