




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
嵌入式總結筆記
?一、c語言
?1、基礎知識
?基本數據類型
?short、int、long、char、float、double
?構造數據類型
.數組
.數組
?構造數據類型之一,數組是具有一定順序關系的若干個變量的集合,
組成數組的各個變量稱為數組的元素,數組中各元素的數據類型要求
相同,用數組名和下標確定。數組可以是一維的,也可以是多維的。
.指針
?在計算機內存中,每一個字節單元,都有一個編號,稱為地址。在C
語言中,內存單元的地址稱為指針,專門用來存放地址的變量,稱為
指針變量
?結構體struct
?由一系列具有相同類型或不同類型的數據構成的數據集合,叫做結構。
?共用體union
?在進行某些算法的C語言編程的時候,需要把幾種不同類型的變量存
放到同一段內存單元中。也就是利用覆蓋技術,使幾個變量互相覆蓋。
這種幾個不同的變量共同占用一段內存的結構類型,在C語言中,被
稱作"共用體"類型結構,簡稱共用體。
?區別
?共用體的成員共用一塊內存區,結構體的成員有個自獨立的內存區。
所以,共用體的成員,對一個進行修改就會影響別的成員的值,而結
構體則不會。
?枚舉enum
?運算符與表達式
?所謂表達式是指由運算符、運算量和標點符號組成的有效序列,其目的是用
來說明一個計算過程。
?程序結構與控制語句
?2、關鍵字的認識
?static
?這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明
顯的作用:
?1)在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不
變。
?2)在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用
函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。
?3)在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。
那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。
?大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少
的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本
地化數據和代碼范圍的好處和重要性。
?extern
?extern是計算機語言中的一個關鍵字,可置于變量或者函數前,以表示變
量或者函數的定義在別的文件中。提示編譯器遇到此變量或函數時,在其它
模塊中尋找其定義,另外,extern也可用來進行鏈接指定。
?const
?我只要一聽到被面試者說:"const意味著常數",我就知道我正在和一個業
余者打交道。去年DanSaks已經在他的文章里完全概括了const的所有用
法,因此ESP(譯者:EmbeddedSystemsProgramming)的每一位讀者應
該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只
要能說出const意味著"只讀"就可以了。盡管這個答案不是完全的答案,但
我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下
Saks的文章吧。)
?如果應試者能正確回答這個問題,我將問他一個附加的問題:
?下面的聲明都是什么意思?
?constinta;
?intconsta;
?constint*a;
?int*consta;
?intconst*aconst;
./******I
?前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整
型數的指針(也就是,整型數是不可修改的,但指針可以)。第四個意思a
是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,
但指針是不可修改的)。最后一個意味著a是一個指向常整型數的常指針
(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。
如果應試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提
一句,也許你可能會問,即使不用關鍵字const,也還是能很容易寫出功能
正確的程序,那么我為什么還要如此看重關鍵字const呢?我也如下的幾下
理由:
?1)關鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,
聲明一個參數為常量是為了告訴了用戶這個參數的應用目的。如果你曾花很
多時間清理其它人留下的垃圾,你就會很快學會感謝這點多余的信息。(當
然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)
?2)通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的
代碼。
?3)合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變
的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。
?volatile
?volatile關鍵字是一種類型修飾符,用它聲明的類型變量表示不可以被某些
編譯器未知的因素更改,比如:操作系統、硬件或者其它線程等。遇到這個
關鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優化,從而可以
提供對特殊地址的穩定訪問。
?attribute機制取消內存對齊
?我們可以按照自己設定的對齊大小來編譯程序,GNU使用_attribute_選
項來設置,比如我們想讓剛才的結構按一字節對齊,我們可以這樣定義結構
體
?
?#和##
?3、數據與指針
?一維數組.一級指針
?所謂一維數組是指只有一個下標的數組。它在計算機的內存中是連續存儲的。
?二維數組.二級指針
?數組指針
?指向規定大小和類型的數組的指針(說明他還是個指針)
?指針數組
?存儲指針的地址的數組(書名他還是個數組)
?4、函數
?函數三要素(功能參數返回值)
?函數指針
?本質:指針,指向函數,該指針指向函數的地址(函數名)
?一般定義形式:
?〈數據類型〉(*函數指針變量名)(〈形參列表>);
?調用:
?函數指針變量名(〈實參〉);
?(*函數指針變量名)(〈實參〉);
?inttest(inta,intb,int(*pFunt)(intm,intn));
?指針函數
.本質:函數,函數的返回值是指針
?一般定義形式:
?〈數據類型〉*函數名(〈形參列表〉)
?(
?函數體;
?return地址常量/指針變量;
?}
?char*strcpy(char*dest,constchar*src);
?char*strcat(char*dest,constchar*src);
?遞歸函數
.所謂遞歸函數是指一個函數的函數體中直接調用或間接調用了該函數自身的
函數。
?遞歸函數調用的執行過程分為兩個階段:
?遞推階段:從原問題出發,按遞歸公式遞推從未知到已知,最終達到遞
歸終止條件。
?回歸階段:按遞歸終止條件求出結果,逆向逐步代入遞歸公式,回歸到
原問題求解。
3
intfunc(intn)
{
if(n<0){
printf("inputerror\n");
return-1;
)
if(n<=1){
return1;
}else(
return(n*func(n-l));3*func(2)—?>2*func(l)
}3*2*1?<2*1?<
}
.回調函數
?5、結構體一聯合體一位域一強轉
?結構體struct
?1、常用寫法
?struct結構體名
?(
.數據類型成員
?}
?2、結構體大小計算
?實際大小可以用sizeof計算
?3、結構體成員訪問
?結構體變量名.成員名
?1.不能將一個結構體類型變量作為一個整體加以引用,而只能對結構體
類型變量中的各個成員分別引用
?4、結構體嵌套訪問
?2.如果成員本身又屬于一個結構體類型,則要用若干個成員運算符,一
級一級的找到最低的一級成員。
?3.對成員變量可以像普通變量一樣進行各種運算(根據其類型決定可以
進行的運算)
?4.在數組中,數組是不能彼此賦值的,而結構體類型變量可以直接相互
賦值
?5、結構體數組
?具有相同結構體類型的結構體變量組成的數組
?6、
?聯合體union
?訪問方式
?union共用體數據類型名{
?成員變量;
?...
?);
?與struct的優劣
?結構體會為每一個成員變量分配空間,共用體分配最大的一個變量所占
的空間。
?6、宏定義一typedef—枚舉
?宏定義#define
?重命名typedef
?枚舉enum
?7、內存管理
?動態內存的申請和釋放
?基礎版動態內存分配malloc
?#include<stdlib.h>
?void*malloc(size_tsize);
■/***************************************************************
**功能:在堆中分配內存空間
?*參數:
**@size分配內存空間的大小(byte)
**返回值:成功返回申請到的內存空間首地址,失敗返回NULL
_**************************************************************/
?/*釋放申請到的內存空間*/
?voidfree(void*ptr);
?升級版動態內存分配
?堆、棧
?6.4G虛擬內存空間劃分:
?0G--3G:用戶空間
?代碼段:
?數據段:
.常量區
?.data段初始化的全局變量和靜態局部變量
?.bss段未初始化的全局變量和靜態局部變量>>>.bss
段清零
?堆區:用戶自己申請的空間
?棧區:局部變量
?3G—4G:內核空間
?c內聯匯編
?8、shell腳本編程
?基本命令()
?⑴shell簡介
?(1)隨著格式Linux系統的圖形化程序的不斷提高,用戶在桌面環境下,通過點擊、
拖拽等操作就可以完成大部分的工作.
?(2)然而,許多UbuntuLinux功能使用shell命令來實現,要比使用圖形界面交互,
完成的更快、更直接。
?(3)英文單詞shell可直譯為"貝殼"。"貝殼"是動物作為外在保護的一種工具。
?(4)可以這樣認為,Linux中的shell就是Linux內核的一個外層保護工具,并負責完
成用戶與內核之間的交互。
Linux內核
Shell
?(5)命令是用戶向系統內核發出控制請求,與交互的文本流。
?(6)shell是一個命令行解釋器,將用戶命令解析為操作系統所能理解的指令,實現用
戶與操作系統的交互。
?(7)當需要重復執行若干命令,可以將這些命令集合起來,加入一定的控制語句,編
輯成為shell腳本文件,交給shell批量執行。
』,用戶在命令行提示符下鍵入命令文本,開始與
Shell進行交互。
接著,Shell將用戶的命令或按鍵轉化成內核所
能夠理解的指令,
網控制操作系統做出響應,直到控制相關硬件設
備
』朦后,Shell將輸出結果通過Shell提交給用戶。
Linux
內核
-
B
u
s
硬件
?注:
?【2】shell命令格式
?(1)最初的UNIXshell經過多年的發展,由不同的機構、針對不同的目錄,開發出許
多不同類型的shell程序。
?目前流行的shell主要有幾種:
?1)BourneShell(簡稱sh):它是Unix的第一個shell程序,早已成為工業標準。
目前幾乎所有的Linux系統都支持它。不過BourneShell的作業控制功能薄弱,
且不支持別名與歷史記錄等功能。
?2)CShell(簡稱csh)
?3)KornShell(簡稱ksh)
?4)BourneAgainShell:能夠提供環境變量以配置用戶shell環境,支持歷史記錄,
內置算數功能,支持通配符表達式,將常用命令內置簡化。
?(2)體驗shell命令的樂趣
?1)立即關機與重啟
?使用系統中的圖形界面
?使用shell命令
?在命令行鍵入一下命令,系統立即關機
?sudoshutdown-hnow
?在命令行鍵入以下命令,系統立即重啟啟動
?sudoshutdown-rnow
?sudorebootnow
?2)定時關機重啟
?a.T立老師在對學生進行上機測試,時間限定在45分鐘內,否則計算機^各自動關
機。
?sudoshutdown-h+45"Thatisall,gameover."
?b.系統正在安裝軟件,安裝時間大概需要持續40分鐘左右,軟件安裝之后需要重
新啟動電腦。用戶可以不必一直等候在機旁。
?使用下面的命令,計算機會在60分鐘后自動重啟。
?sudoshutdown-r+60
?⑶shell提示符標識了命令行的開始。($為當前用戶#為超級用戶)用戶在提示符后
面輸入一條命令并按Enter鍵,完成向系統提交命令。
?通常shell命令提示符采用以下的格式:
?username@hostname:directions
?用戶名主機名目錄名
?1)username:用戶名,顯示當前登錄用戶的賬戶名(執行的命令是whoami)
?2)hostname:主機名,顯示登錄的主機名,例如若遠程登錄后,則顯示登錄的主
機名;(執行的命令是hostname)
?3)direct體。n:目錄名,顯示當前所處的路徑,當在根目錄下顯示為7",當在用
戶主目錄下顯示為'(執行的命令是pwd)
?(4)通常一條命令包含三個要素:命令名稱、選項、參數。命令名稱是必須的,選項
和參數都可能是選項。命令格式如下:
?$Command[-Options]ArgumentlArgument2...
?指令選項參數1參數2...
?$:Shell提示符,如果當前用戶為超級用戶,提示符為,其他用戶的提示符均
為"$";
?Command:命令名稱,Shell命令或程序,嚴格區分大小寫
?Options:命令選項,用于改變命令執行動作的類型,由引導,可以同時帶有
多個選項;
?Argument:命令參數,指出命令作用的對象或目標,有的命令允許帶多個參數
?(5)shell命令格式
?1)一條命令的三要素之間用空格隔開;
?2)若將多個命令在一行書寫,用分號(;)將各命令隔開;
?3)如果一條命令不能在一行寫完,在行尾使用反斜杠(\)表明該條命令結束。
?(6)不帶選項和參數
?1)Is命令未帶任何參數,列出當前目錄中的所有文件,只顯示文件名稱
?2)命令不帶選項或參數,通常意為使用默認選項或參數
?【3】shell命令行操作
?(1)bash除了在命令編輯功能上比sh有很大改進外,還增加了特有功能極大地方便
了用戶在shell命令行上的操作。
?1)補齊命令與文件名
?2)查詢命令歷史
?3)等等
?(2)補齊命令與文件名
?1)在使用Shell命令時,很多用戶會經常遇到命令或文件名沒有記全的情況。在輸
入命令或文件名的前幾個字符后,按TAB鍵或ESC鍵自動補齊剩余沒有輸入的字
符串。
?2)如果存在多個命令或文件有相同前綴,shell將列出所有相同前綴的命令或文件。
shell給出的提示信息,幫助用戶回憶和完成輸入,之后等待用戶輸入足夠的字符。
?3)需要說明的是,連續按兩下TAB鍵或ESC鍵,用于命令補齊;按一次TAB鍵,
用于文件名補齊。
?(3)查詢命令歷史
?1)用戶在Shell下的操作是有很大連續性的,曾經輸入的命令可能需要多次使用。
當用戶在操作中發現問題,需要杳看曾經執行過的操作。Bash將用戶曾經輸入的
命令序列保存在一個命令歷史表中。按"V和"1"鍵,便可查詢歷史命令。
?2)BashShell還提供了history命令。該命令將歷史表按列表形式,從記錄號1
開始,一次性全部顯示出來。
?history[numberline]
?3)顯然history只能記錄有限條的歷史命令,默認保留500條命令。
?!命令號(history查看的那個命令)執行這個命令
■
?4)BashShell將歷史命令容量保存在環境變量HISTSIZE中。
?1)使用"echo$HISTSIZE”查看當前歷史命令容量;
?2)通過直接賦值的方法,修改當前環境變量。
?echo$HISTSIZE=50
?或者修改家目錄下的.bashrc配置文件中的HISTSIZE
?[4]man、passwd、su、echo命令的用法
?(1)獲取聯機幫助
?1)使用man命令可以找到特定的聯機幫助頁,并提供簡短的命令說明。一般語法
格式為:
?mancommandname
?2)聯機幫助頁提供了指定命令commandname的相關信息,包括:名稱、函數、
語法以及可選參數描述等。
?無論幫助有多長,都遵循這個格式顯示。在頁面很多的情況下使用PageUp和
PageDown鍵翻頁。最后,使用":q"退出幫助頁面。
?(2)通常聯機幫助信息包括以下幾個部分:
?1)NAME:命令的名稱
?2)SYNOPSIS:命令的語法格式
?3)DESCRIPTION:命令的一般描述以及用途
?4)OPTIONS:描述命令所有的參數或選項
?5)SEEALSO:列出聯機幫助頁中與該命令直接相關或功能相近的其他命令
?6)BUGS:解釋命令或其輸出中存在的任<可已知的問題或缺陷
?7)EXAMPLES:普通的用法示例
?8)AUTHORS:聯機幫助頁以及命令的作者
?(3)man3printf查庫函數
?man2open查系統調用
?man-aopen會將系統中與open相關的都列出來
?(4)基本系統維護命令
?1)passwd
?a.出于系統安全考慮,Linux系統中的每一個帳號都必須同時具備用戶名和密
碼。
?b.可以使用passwd命令,為已有賬戶重新修改用戶口令。
?c.需要說明的是,超級用戶root可以修改所有其他用戶的口令,而普通用戶只
能修改自己的用戶口令,如果確要修改超級用戶或其他用戶口令的話,需要具
有超級用戶的權限。
?passwd命令的一般語法格式為:
?passwdusername
?2)單獨使用passwd命令,意為修改當前用戶自己的口令。下面命令實例用于修改
用戶自己的口令。
?linux@ubuntu:~$passwd
?Changingpasswordforlinux#修改當前用戶口令
?(current)UNIXpassword:#用戶輸入舊口令
?EnternewUNIXpassword:#用戶輸入新口令
?RetypenewUNIXpassword:#確認新口令
?passwd:已成功更新密碼
?-I:鎖定用戶
?-u:解鎖用戶
?3)su
?a.su命令用于臨時改變用戶身份,具有其他用戶的權限。普通用戶可以使用
SU命令臨時具有超級用戶的權限;
?超級用戶也可以使用普通用戶身份完成一些操作。當需要放棄當前用戶身份,
可以使用exit命令切換回來。SU命令的一般語法格式為:
?su[-c|-m-]username
?b.選項"-c"表示執行一個命令后就結束;-m表示仍保留環境變量不變;-表
示轉換用戶身份時,同時使用該用戶的環境。
?單獨使用su命令,默認為要轉換為超級用戶root.下面命令實例臨時獲取超
級用戶root的權限。
?可以從命令提示符中可以看出,"linux”用戶使用su命令切換為root用戶。
?linux@ubuntu:~$su
?Password:#當前用戶輸入超級用戶的口令
?root@ubuntu:/home/linux#
?4)echo
?a.echo命令用于在標準輸出—顯示器上顯示一段文字,一般起到提示作用.
?echo命令的一般語法格式為:
?echo[-n]information
?b.選項-n表示輸出文字后不換行。提示信息字符串可以加引號,也可以不加。
?linux@ubuntu:~$echo"Helloeveryone."#輸入信息字符串使用
引號
?Helloeveryone.
?linux@ubuntu:~$echo'$PATH'#嚴格的原樣輸出
?$PATH.
?linux@ubuntu:~$echoHelloeveryone.#輸入信息字符串不
使用引號,字符串之間用一個空格隔開
?Helloeveryone.
?[5]date、clear、df、du命令的用法
?(1)date
?a.date命令用于顯示和設置系統日期和時間。date命令的T殳語法格式為:
?date[-d|-s|-u]datestr
?b.選項-s表示按照datestr日期顯示格式設置日期;單獨使用date命令,用于顯
示系統時鐘中當前日期。
?時間的格式為:"hh:mm:ss",日期格式為:"mm/dd/yy"。
?linux@ubuntu:~$date#查看當前時間
?2007年09月16日星期日18:44:45CST
?(2)clear
?a.clear命令用于清除屏幕上的信息。清屏后,sell命令提示符移動到屏幕左上角。
?clear命令的一般語法格式為:
?clear
?b.由于shell命令是逐行執行,執行結果也將隨即顯示。因此,用戶在使用命令終
端窗口時,終端窗口會很快就會被字符占滿。
?clear可以幫助清理一下窗口中雜亂的字符顯示。
?(3)df
?a.df命令用于查看磁盤空間的使用情況。查看磁盤空間是用戶應當經常做的事情,
因為誰也不希望看到根或/var分區在不經意間填滿,以便及時清理。df命令的一般
格式為:
?df[-a|-T|-h|-k]Filesystem
?其中,參數Filesystem表示物理文件系統。各選項的含義如表所示。
?選項含義
?-a顯示所有物理文件系統的使用情況,包括虛擬文件系統,如/proc、
/sys等
?-T顯示物理文件系統的文件格式類型
?-h物理文件系統大小按兆字節為單位顯示
?-k物理文件系統大小按千字節為單位顯示
?b.從以下命令的執行結果可以看到,這臺計算機只有一塊硬盤(/dev/sdal),文
件格式類型為Ext3,已經使用36%的存儲空間。同時,可以發現計算機上還安裝
了CD-ROM(/dev/hdc)、USB存儲器(/dev/sdbl)。其他分區均為專用的虛
擬文件系統
linux@ubuntu:-Sdf-T
文件系統1K-塊已用可用已用%掛載點
devsdalext378509962664868478731636°o
varruntmpfs2559601042558561%varmn
varlocktmpfs25596002559600%varlock
procbususbusbfs255960842558761%proc/l)ususb
udevtmpfs255960842558761%/dev
devshmtmpfs25596002559600%/dev/shm
Irmtmpfs2559603378822217214%hbmodules2.6.20-16-generic.volatile
devlidciso96607129467129460100%mediacdromO
devsdblvfat2495822116023798085%mediadisk
?c.df命令
?常用參數:
?-a:列出所有文件系統
?-k:列出磁盤的分配情況(KB)
?-h:同-k,但大小以G、M,K單位顯示
?-I:僅列出本地文件系統
?例:
?#df-h
?du命令,列出目錄和文件所使用的磁盤塊數,每塊占512個字節。
?常用參數:
?-a:僅列出空閑的文件數
?-h:列出磁盤的使用情況(KB)
?-s:列出總的空閑空間(KB)
?例:
?#du-h/etc
?【10】使用ps命令查看進程
?pid進程號
該進程的狀態
占用的舊憶體使用率
占川的CPU使IJ率占牛的記憶體大小
占用的呷擬記Z體大小進半開始”間
既
connAMD
init(3J
懣(migration^01
[ksoft.irqdxB]
(euentsxB)
逮(khelperJ
(kthrcad1
【keepid]
懣(kblockdxB]
tpdflush)
【pdflush】
?⑴顯示進程(process)的動態
?(2)語法:
?ps[options]
?(3)常見的參數:
?-A列出所有的行程
?-w顯示加寬可以顯示較多的資訊
?-au顯示較詳細的資訊
?-aux顯示所有包含其他使用者的行程(一般結合管道|grep{指定的文件})
?(4)%CPU占用的CPU使用率
?%MEN占用的記憶體使用率
?VS2占用的虛擬記憶體大小
?RSS占用的記憶體大小
?STAT該進程的狀態
?START進程開始時間
?TIME執行的時間
?(5)進程的狀態標志
?+:在前臺
?D:不可中斷的靜止
?R:正在執行中
?S:阻塞狀態
?T:暫停執行
?Z:不存在但暫時無法消除(僵尸態)
?<:高優先級的進程
?N:低優先級的進程
?L:有內存分頁分配并鎖在內存中
?(6)top命令
?1)監視進程
?2)通常會全屏顯示,而且會隨著進程狀態的變化不斷更新
?3)整個系統的信息也會顯示,為查找問題提供了便利
?4)可以顯示系統總共有多少CPU和內存資源以及負載平衡等信息。
?renice指定優先級,(NI)
Li>|iA9:03:04up3:36.1itsttr,Iu<iddverayu:R.G0,R.00,fl.00
Tasks:48€ot<xl,1runiiiiiif,4?sleepiny>0stopped>0zombie
Cpu(s):B.0Zus,l.?Zsy,niz90.3Zid,B.SzMa,0.叱hi,0.0Zsi
Men:1B97ZHktotal.lZ43lMJkused,6S4N0kFree,8kbuffers
Sutiji:915664k.Okused?315664kfree,Rd83^kc*ichc<l
TIHE*CtJUriAND
HM.1top
00.67init
00.00migration,。
nn.cinksertimjd/fi
06.11euents/0
00.05khelper
00.00kthread
00.00kacuid
?(7)pstree命令
?1)將所有行程以樹狀圖顯示,樹狀圖將會以pid(如果有指定)或是以init這個基本進
程為根,如果有指定使用者id,則樹狀圖會只顯示該使用者所擁有的進程。
?2)參數:
?-a顯示該進程的完整指令及參數,如果是被記憶體置換出去的進程則會加上括號
?-c如果有重覆的進程名,則分開列出
?【11】使用kill命令終止進程(發信號)
?(1)使用kill命令終止進程
?kill[-signal]PID
?signal是信號,PID是進程號
?kill命令向指定的進程發出一個信號signal,在默認的情況下,kill命令向指定進程
發出信號15,正常情況下,將殺死那些不捕捉或不忽略這個信號的進程
?kill-1顯示系統現在支持那些信號
?9)SIGKILL
?15)SIGTERM
?shell腳本語法
?1.變量
?【1】shell腳本的基礎知識
?(1)shell腳本的本質
?編譯型語言
?解釋型語言
?shell腳本語言是解釋型語言
?shell腳本的本質
?shell命令的有序集合
?(2)shell編程的基本過程
?基本過程分為三步:
?stepl.建立shell文件
?包含任意多行操作系統命令或shell命令的文本文件;
?step2.賦予shell文件執行權限
?用chmod命令修改權限;
?step3.執行shell文件
?直接在命令行上調用shell程序.
?(3)實例
?stepl:建立shell文件(可用任何建立文本文件的方法)
?$catprogl.sh
?date
?Step2:賦予執行權限:(初始文本文件無執行權限)
?$chmod740progl.sh
?$chmodu+xprogl.Ish
?Step3:執行該shell程序
?$progl.sh
?progl.sh:notfound
?(shell在標準搜索路徑中找不到progl.sh)
?Step4:指定路徑或修改環境變量PATH后執行shell程序
?$./progl.sh
?2009年12月16日星期二14:52:57CST
?[2]shell變量
?(1)shell變量
?shell允許用戶建立變量存儲數據,但不支持數據類型(整型、字符、浮點型),
將任何賦給變量的值都解釋為一串字符
?Variable=value
?a.count=l
?b.echo$count
?c.DATE='date'
?d.echo$DATE
?⑵BourneShell有如下四種變量:
?1)用戶自定義變量
?2)位置變量即命令行參數
?3)預定義變量
?4)環境變量
?(3)用戶自定義變量
?1)在shell編程中通常使用全大寫變量,方便識別
?$COUNT=1
?2)變量的調用:在變量前加$
?$echo$HOME
?3)LinuxShell/bash從右向左賦值
?$Y=y
?$X=$Y
?$echo$X
?y
?4)使用unset命令刪除變量的賦值
?$Z=hello
?$echo$Z
?hello
?$unsetZ
?$echo$Z
?(4)位置變量
?$0與鍵入的命令行一樣,包含腳本文件名
?$1,$2,……$9分別包含第一個到第九個命令行參數
?預定于變量
?$#包含命令行參數的個數
?$@包含所有命令行參數:"$L$2,……$9"
?$?包含前T命令的退出狀態
?$*包含所有命令行參數:"$L$2,……$9"
?$$包含正在執行進程的ID號
?⑸常用shell環境變量
?HOME:/etc/passwd文件中列出的用戶主目錄
?IFS:InternalFieldSeparator,默認為空格,tab及換行符
?PATH:shell搜索路徑
?PSI,PS2:默認提示符⑶及換行提示符(>)
?TERM:終端類型,常用的有vtl00,ansi,vt200,xterm等
?2.輸入輸出
?(1)常用功能性語句(命令)
?read從標準輸入讀入一行,并賦值給后面的變量,其語法為:
?readvar
?把讀入的數據全部賦給var
?readvarlvar2var3
?把讀入行中的第一個單詞(word)賦給varl,第二個單詞賦給var2把其余所有
的詞賦給最后一個變量.
?如果執行read語句時標準輸入無數據,則程序在此停留等侯,直到數據的到來或被
終止運行。
linuxl@ubuntu:-/tast$vitast.sh
linuxl@ubuntu:~/tast$./tast.sh
bash:./tast.sh:Permissiondenied
linuxl@ubuntu:~/tast$chmodu+xtast.sh
linuxl@ubuntu:~/tast$./tast.sh
inputadate:
19960206
yearmouthday:1996-02-06
linuxl(aubuntu:-/tast$|
QGvUnuxl⑥ubuntu:
1#!/bin/bash
2
3echo"inputadate:**
4readABC
5echo"yearmouthday:$A-$B-$C"
6I_______________________________________________________________________________
?(2)應用實例
?#examplelforread
?echo"Inputyourname:\cn
?readusername
?echo"Yournameis$usernamen
?#example2forread
?echo"Inputdatewithformatyyyymmdd:\c"
?readyearmonthday
?echo"Todayis$year/$month/$day,right?"
?echo"Pressentertoconfirmandcontinue\c"
?readanswer
?echo"Iknowthedate,bye!"
?3.數據計算
?expr命令
?算術運算命令expr主要用于進行簡單的整數運算,包括加(+)、減(-)、乘(\*)、
整除(/)和求模(%)等操作。
?例如:
gUnux1@ubuntu:~/tast
linuxl@ubuntu:~/tast$vitast.sh
linuxl@ubuntu:~/tast$chmodu+xtast.sh
linuxl@ubuntu:"/tast$./tast.sh
T=2+10xl0/6
18
<linuxl@ubuntu:~/tast$|
Unux1@)ubuntu:~/tast
1#!/bin/bash
2
3echo"T=2+16xl0/6”
4T=expr2+10\*10/6
5#賦值兩邊不能加空格
'6用命令需要加上''
7#由于沒有數據類型所以數值兩邊需要加上空格
8echo$T
9
?測試語句
?(l)test語句
?test語句可測試三種對象:
?字符串整數文件屬性
?(2)每種測試對象都有若干測試操作符
?例如:
?test"$answer"="yes"
?變量answer的值是否為字符串yes
?test$num-eq18
?變量num的值是否為整數18
?test-dtmp
?測試tmp是否為一個目錄名
?(3)字符串測試
1#!/bin/bash
2
3A=116
4B=116
5test$A=$B
6echo$?
7
8readCD
9[$C=$D]
#用【】好像也可以測試
ii#符號兩邊都需都空格
12echo$?
13
14test-zA
15echo$?
16
17test-nB
18echo$?
19
linuxl(aubuntu:~/tast$vitast.sh
linuxl@ubuntu:~/tast$./tast.sh
0
200100
1
1
0
linuxl@ubuntu:~/tast$,
?si=s2測試兩個字符串的內容是否完全一樣
?si!=s2測試兩個字符串的內容是否有差異
?-Zsi測試si字符串的長度是否為0
?-nsi測試si字符串的長度是否不為0
?(4)整數測試
1#!/bin/bash
2readAB
3[$A-eq$B]
4echo$?
5[$A-ne$B]
6echo$?
7#可以用以代替test但【】兩邊必須有空
8test$A-gt$B
9echo$?
10
11test$A-ge$B
12echo$?
13
14test$A-It$B
15echo$?
16
17test$A-le$B
18echo$?
linuxl@ubuntu:~/tast$./tast.sh
200100
1
./tast.sh:line5:[:missing']1
2
0
0
1
1
linuxl(aubuntu:~/tast$|
?a-eqb測試a與b是否相等
?a-neb測試a與b是否不相等
?a-gtb測試a是否大于b
?a-geb測試a是否大于等于b
?a-Itb測試a是否小于b
?a-leb測試a是否小于等于b
?(5)文件測試
?-dname測試name是否為一個目錄
?-ename測試一個文件是否存在
?-fname測試name是否為普通文件
?-Lname測試name是否為符號鏈接
?-rname測試name文件是否存在且為可讀
?-wname測試name文件是否存在且為可寫
?-xname測試name文件是否存在且為可執行
?-sname測試name文件是否存在且其長度不為0
?fl-ntf2測試文件fl是否比文件f2更新
?fl-otf2測試文件fl是否比文件f2更舊
?4控制語句
?[1]條件語句
?(1)結構性語句
?結構性語句主要根據程序的運行狀態、輸入數據、變量的取值、控制信號以及
運行時間等因素來控制程序的運行流程。
?主要包括:條件測試語句(兩路分支)、多路分支語句、循環語句、循環控制
語句和后臺執行語句等。
?(2)條件語句
?if...then...fi
?語法結構:
?if表達式
?then命令表
?fi
?1)如果表達式為真,則執行命令表中的命令;否則退出if語句,即執行fi后面的
語句。
?2)if和fi是條件語句的語句括號,必須成對使用;
?3)命令表中的命令可以是一條,也可以是若干條。
?(3)復習-文件測試
?-dname測試name是否為一個目錄
?-ename測試一個文件是否存在
?-fname測試name是否為普通文件
?-Lname測試name是否為符號鏈接
?-rname測試name文件是否存在且為可讀
?-wname測試name文件是否存在且為可寫
?-xname測試name文件是否存在且為可執行
?-sname測試name文件是否存在且其長度不為0
?fl-ntf2測試文件fl是否比文件f2更新
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 即熱食品供電式加熱盒的電路設計及應用
- 空間敘事視角下馬嵬驛民俗村景觀優化策略研究
- 海安企業勞動合同新
- 旅游行業智慧出行與個性化服務方案
- 食品加工企業安全職責及制度建設
- 生態批評實踐
- D氣田地質力學建模與井壁穩定性分析
- 完整居住社區建設背景下西安市社區復合型服務設施設計策略研究
- 農民合作社人才培養與培訓協議
- 2025年美容師高級護理技能測試卷(美容師美容院服務流程)
- 《中國糖尿病防治指南(2024版)》解讀
- 2025年關于美發學員合同
- 糖尿病患者的足部護理
- 土地流轉合同補充協議書
- 七年級語文下冊《登幽州臺歌》課件
- 兼職勞務協議合同模板
- 2025-2030中國改性塑料市場盈利能力預測及發展機遇規模研究報告
- 2025全國國家版圖知識競賽題庫及答案(300題)中小學組試題及答案
- 2025年河南機電職業學院高職單招語文2019-2024歷年真題考點試卷含答案解析
- 《旅行社經營與管理》電子教案 5-1 旅行社接待業務1
- (二模)東北三省三校2025年高三第二次聯合模擬考試 英語試卷(含答案解析)
評論
0/150
提交評論