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中的自動變量
經常使用的自動變量
$@ 表示規則的目標文件名
$> 規則的依賴文件名
$^依賴的文件集合