【Linux】Linux 學習筆記2015(基礎篇)

標籤(空格分隔): Linux

Author:atao

[補充]

清屏

  1. Ctrl + l
  2. clear

查看linux版本信息

uname -a

掛載nfs(網絡文件)的方法

##1. 掛載
格式:mount -t nfs 網絡地址:/共享目錄 要掛載到的目錄
mount -t nfs 192.168.1.150:/home/jacky/ET05_linux_program /home/nfs
##2. 卸載
格式:umount 已掛載的目錄
umount /home/nfs
##3.共享時設權限
vim /etc/exports
修改內容爲:/home/jacky/ET05_linux_program/*(ro)

進程管理命令

• top 動態顯示系統中的進程
• kill 終止進程
• CTRL+C 終止正在運行的進程
• CTRL+Z懸掛正在運行的進程
• jobs 顯示後臺和停止的進程
• bg %任務號 將懸掛進程在後臺繼續運行
• fg %任務號 將懸掛進程/後臺進程轉到前臺
• /proc/<進程編號>
//這是一個虛擬目錄,下面各個文件表示進程各種情息,可以用cat 查看
//比如1號進程,可以用查看各種狀態 cat /proc/1/status

進程編程

• 常見進程控制函數

– fork – 創建一個新進程
– exec – 用一個新進程去執行一個命令行
– exit – 正常退出進程
– abort – 非正常退出一個進程
– kill – 殺死進程或向一個進程發送信號
– wait – 等待子進程結束
– sleep – 將當前進程休眠一段時間
– getpid – 取得進程編號
– getppid – 取得父進程編號

一、代碼查看器

• SourceInsight軟件
用法:1,先建工程(project),工程名一般用英文,路徑一般設爲與查看的文件在同一個目錄(如:myApp/pro)
2,選擇源碼的路徑(如:myApp)
3,同步文件.右擊點SynchronizeFiles,或者點菜單欄的“書”圖標,點擊後默認選項就可以.

二、gcc

用法:1,格式,gcc -o 輸出文件名 輸入文件名
2,複製,cp [參數] 源文件名 目標文件名

三、遠程連接工具

1.Winscp
2.SecureCRT

四、常用命令

1.mkdir 創建新目錄
參數:-p //可以實現在新目錄下再創建新目錄
      -m 777  //設置權限
2.rmdir 刪除目錄
    • rmdir 目錄名   //刪除指定目錄
3.touch 創建文件
參數:touch "帶空格的文件名" 
//不帶雙引號則創建兩個文件,不建議帶空格的文件名

壓縮/解壓命令

1. tar 打包/壓縮命令
    1)tar常用參數
        • -c 創建tar 文件
        • -r 代替一個tar文件裏內容
        • -f 將文件打包生成到一個文件裏
        如:tar –cvf new.tar /home/atao
        //表示將atao目錄打包壓縮到new.tar壓縮文件裏
        • -v 詳細顯示處理過程
        • -x 對tar 進行解包
        如:tar –xvf new.tar /home
        //表示將將new.tar解壓到/home目錄下
        • -z 用 gzip 對存檔壓縮或解壓
        • -j 用bzip2 來解壓縮
        • -t 顯示tar文件裏的文件名
        • -C 指定要解壓到的目錄
    2)常用組合
     • 壓縮
     tar cvzf/cvjf 壓縮包名.tar.gz  要壓縮的文件/目錄
     • 解壓
     tar xvzf/xvjf 壓縮包  -C 要解壓到的目錄
2. gzip [要壓縮的文件]
//注意:這個命令只能壓縮文件,不能壓縮目錄,並且不保留原文件
    功能描述:將指定的文件壓縮爲*.gz
    eg#:gzip text.c   //將text.c壓縮,並創建爲text.c.gz
3. gunzip [要解壓的文件]
//注意:這個命令只能解壓文件,不能解壓目錄
    功能描述:將指定的*.gz壓縮文件解壓
    eg#:gunzip text.gz  //將text.gz壓縮文件解壓
4. zip [-r] [壓縮後的文件名] [要壓縮的文件/目錄]
    功能描述:壓縮文件或目錄(加-r選項表示是壓縮目錄)
    eg1#:zip -r demo.zip demo    //將目錄demo壓縮爲demo.zip
    eg2#:zip text.zip text.c    //將文件text.c壓縮爲text.zip
5. unzip [壓縮文件.zip]
    功能描述:將壓縮文件.zip解壓
    eg#:unzip demo.zip
6. bzip2 [-k] [文件]
    功能描述:壓縮文件(-k選項表示壓縮後保留原文件)爲*.bz2
    eg#:bzip2 -k main.c //將main.c壓縮爲main.c.bz2
7. bunzip2 [壓縮文件.bz2]
    功能描述:將壓縮文件.bz2解壓
    eg#:bunzip2 main.c.bz2  //將main.c.bz2文件解壓

查看文件命令

1. cat  文件名   //查看文件內容(只適合內容不多的文件)
• 參數:-n  //查看內容的同時還顯示行號
	-b或--number-nonblank 和 -n 相似,只不過對於空白行不編號
	-s或--squeeze-blank連續兩行以上的空白行,代換爲一行的空白行
• cat 實例
1) cat hello.txt //顯示hello.txt 內容
2) cat hello1.txt hello2.txt > hello3.txt
//把hello1.txt內容與hello2.txt內容合併,輸出到hello3.txt中
3) cat -n textfile1 > textfile2
//把 textfile1 的檔案內容加上行號後輸入 textfile2 這個檔案裏
4) cat -b textfile1 textfile2 >> textfile3
//把 textfile1和textfile2的檔案內容加上行號(空白行不加)之後將內容附加到 textfile3 裏。
2. tac  文件名   //倒着顯示文件內容(命令也很有意思,就是cat倒着輸入)
3. more 文件名 //查看文件內容
參數:(空格)或f  ---> 翻頁
   (Enter)  ---> 換行
	+/搜索詞   --->表示從搜索詞的地方開始顯示
	-數字  --->每屏顯示的行數
4. ls 查看目錄文件信息
    1)-a 顯示指定目錄下所有子目錄與文件,含隱藏文件。
    2)-A 顯示指定目錄下所有子目錄與文件,含隱藏文件。但不列出     “.”和 “..”。
    3)-c 按文件的修改時間排序。
    4)-C 分成多列顯示各項。
    5)-d 如果參數是目錄,只顯示其名稱而不顯示其下的各文件。往往與l選項一起使 用,以得到目錄的詳細信息。
    6)-i 在輸出的第一列顯示文件的i節點號。
    7)-l 以長格式來顯示文件的詳細信息。
    8)-R 遞歸式地顯示指定目錄的各個子目錄中的文件。
    9)-s 給出每個目錄項所用的塊數,包括間接塊。
eg:ls -i 文件名    //查看文件的id節點編號
	q或Q   --->退出
5. less  文件名   //分頁顯示文件內容(可向上翻頁)
參數:  (pgup鍵)或上  --->向上翻頁
	     /搜索詞    --->還可查找搜索詞 
	     //當查找到搜索詞時可以繼續按“n”向上查看
6. head  文件名    //默認顯示文件前10行內容
參數: -n  指定行數
7. tail 文件名     //默認顯示文件後10行內容
參數: -n  指定行數
       -f  動態顯示文件末尾內容  -->意思是記錄會不斷更新顯示 
8. chmod修改權限
命令:chmod {augo}{rwx} 文件名   如:chmod -R 4777 demo1 
參數:-R 遞歸
	4--->setUID   //按照所有者的權限訪問文件
	2--->setGID   //按照所屬組的權限訪問文件
其中: 4--可讀(r)  2--可寫(w)  1--可執行(x)  
組合代表的用戶:所有者     所屬組     其它人
9. 修改文件/目錄的所有者
命令:chown 用戶 文件或目錄    
//將文件或目錄的所有者改爲要設置的用戶
例如:chown atao demo1
10. 修改文件/目錄的所屬組
命令:chgrp 用戶組 文件或目錄 
//將文件或目錄的所屬組改爲要設置的組
11. umask -S  //顯示、設置文件的缺省權限
• 設置權限方法
eg:777 rwx rwx rwx //先把所有權限寫出來
       rwx r-x r-x //然後寫出想設置成的權限
 得出設置值:022   //做出^(異或運算) 
 開始設置:#:umask 022  //將權限設置成了755

文件查找命令

1.find實時查找文件
命令:find 搜索範圍 -name 文件名   //文件搜索命令
參數:
• -name 按照文件名查找文件。
• -type
查找某一類型的文件,諸如:
    – b - 塊設備文件。
    – d - 目錄。
    – c - 字符設備文件。
    – p - 管道文件。
    – l - 符號鏈接文件。
    – f - 普通文件。
    - perm - 權限
如:find /home -name main.c    //在home目錄下搜索main.c文件
又如:find /home -name *main*  
//只要有包含main的文件都能被搜索到--->*文件名*
eg1:find /home -name mai?   //精確查找--->加?號
eg2:find /home -iname main    //-iname  不區分大小寫字母
eg3:find /home -size +204800   //根據文件大小查找 
eg4: find . -type f   //根據文件類型查找文件
eg5: find -perm 777 //根據權限查找文件
參數1:  +數字--->大於   +數字--->小於   數字--->等於
注意:  1數據塊 = 512字節 = 0.5K 
	100MB = 102400KB = 204800
參數2:-user 所有者名 //在目錄下查找所有者爲所有者名的文件
	-group 所屬組名  //在目錄下查找所屬組爲所屬組名的文件
參數3:-amin 訪問時間  
//-amin -5 => 查找5分鐘內被修改過屬性的文件和目錄
	-cmin 文件屬性
	-mmin 文件內容
參數4:-a  //即and,意思是兩個條件同時滿足
	-o //即or,兩個條件滿足任意一個即可
參數5:-exec/ok  ls -l  {} \;             
//對搜索出來的文件進行詳細顯示
參數6:-type  //根據文件類型查找   
其中:f->一般文件   d->目錄  l->軟鏈接文件
如:find /home -name mai* -a -type d
參數7:-inum  節點號   //根據i節點查找
2.locate智能快捷定位查找文件,需要更新文件資料庫,不然新建的文件查找不到
命令:locate 文件名   回車
參數:-i    //不區分大小寫
更新文件資料庫命令:updatedb  回車    //手動更新文件資料庫 
3.刪除文件 (帶空格的文件)
方法一、rm -f ni\ hao 回車   //刪除“ni hao”帶空格的文件
方法二、rm -f "ni hao"
方法三、find . -inum 節點號 -exec rm {} \;
或者:find . -inum 節點號 -ok rm {} \;
4.mv 移動和修改文件名
5.rm 刪除
• 參數含意
    1)-r 遞歸刪除, 刪除一個完整目錄及其子目錄
    2)-f 不詢問直接刪除
    3)-d 表示刪除目錄
    4)-i 詢問確認的選項,這是rm命令默認參數,知道就行
• 一般組合使用,快速刪除一個目錄
     rm –rfd mydir
6.cp 複製
命令:cp -rp 原文件或目錄  目標目錄
參數:-r 複製目錄   -p  保留文件屬性   +  同步更新
如:cp -p + 文件名  //拷貝的同時保存該文件的屬性,相當於硬鏈接
• 語法: cp [選項] 源文件或目錄 目標文件或目錄
//從源文件拷貝到目標文件或路徑
• 常用選項含義如下:
    1、-d 拷貝時保留鏈接。
    2、-f 覆蓋已經存在的目標文件而不提示。
    3、-i 要提示要求用戶確認。
    4、-R 若給出的源文件是一目錄文件,此時cp將遞歸複製該目
    錄下所有的子目錄和文件。此時目標文件必須爲一個目錄名。
    5、-b生成已存在目標文件的覆蓋之前備份
    6、-a 該選項通常在拷貝目錄時使用。它保留鏈接、文件屬性,
    並遞歸地拷貝目錄,其作用等於dpR選項的組合。
• cp支持文件名通配符
    1)*任意字符文件
    • cp *.conf /home 
    //拷貝當前目錄下所有以.conf結尾的文件到/home目錄
    2)?,代表一個字符
7.which 搜索命令所在的位置
• 語法結構:which 命令
功能描述:搜索命令所在目錄及別名信息
eg:which cp     //查找cp命令所在的目錄
8.whereis 搜索命令
• 語法結構:whereis 命令
功能描述:搜索命令所在的目錄及幫助文檔路徑
eg:whereis touch

文本查找命令

1.grep 查找文本內容所在的文件
• 命令參數
    1、-r 表示不僅在當前目錄查詢,而且還可查詢子目錄
    2、-i 不區分大小寫
    3、-l 只列出匹配的文件名
    4、-w 匹配整個單詞.
    5、-v 排除指定字符串
    eg#:grep -iv 字符串 文件
    比如:grep -v ^# /etc/inittab //查找文件時排除註釋行
    其中:字符^後面跟字符->表示以某某字符開頭的行
• grep實例
    @ 查找某個目錄下包含關鍵字的文件
    grep –r 要查找的文件內容 查詢路徑
    eg:grep –r abc /home/atao/*

//查找目錄下/home/atao/所有文件,把包含abc的文件內容在屏幕上顯示
@ Grep 的一個重要作用是通過管道用於過濾命令輸出的結果
ps –a | grep smbd
@把命令ps –a的結果過濾,查找包含smbd的內容
@ Grep 採用正則表達式的匹配機制
1)$ ls -l | grep ‘^a’
//通過管道過濾ls-l輸出的內容,只顯示以a開頭的行。
2)$ grep ‘[a-z]{5}’ aa //顯示aa文件所有包含每個字符串至少有5個連續小寫字符的字符串的行。

目錄文件命令

1.ln文件鏈接(相當於快捷方式)
   • 軟鏈接
   命令:ln -s 源文件/目錄  目標文件/目錄
   //相當於給源文件創建了一個快捷方式,id節點號與源文件不同
   • 硬鏈接
   命令:ln 源文件/目錄  目標文件/目錄
   //相當於創建了一個快捷方式和複製了這個文件,id節點與源相同

查看幫助命令

  1. man [命令或配置文件]
    功能描述:獲得幫助信息
    eg#:man mkdir //查看mkdir命令的使用幫助
    其它選項:1 表示查看的是命令的幫助 5 表示查看的配置文件的幫助
    eg#:man 5 passwd //查看的是passwd配置文件的幫助
  2. whatis [命令]
    功能描述:只查看某一命令是幹什麼用的
    eg#:whatis ls //查看ls命令是幹什麼用的
    3.apropos [配置文件]
    功能描述:只查看某一配置文件的作用
    eg#:apropos services //查看services配置文件的作用
  3. [命令] --help
    功能描述:查看命令有哪些選項並對應的功能
    eg#:touch --help //查看touch有哪些選項
  4. help [命令]
    功能描述:查看shell內置命令的幫助信息
    eg#:help cd //查看cd的幫助信息

用戶管理命令

  1. useradd [用戶名]
    功能描述:添加用戶名
    eg#:useradd atao //添加了一個atao的新用戶
  2. passwd [用戶名]
    功能描述:添加用戶密碼
    eg#:passwd atao //表示將要爲atao設置一個密碼
  3. who
    功能描述:查看用戶登錄信息
    eg#:who
    執行後會顯示的結果:
    登錄的用戶名 登錄的終端(tty本地終端 pts遠程終端) 登錄時間 IP
  4. w
    功能描述:查看登錄用戶的詳細信息
    eg#:w

五、系統查詢命令

1.ps查看系統激活進程
• 語法: ps [option]
• ps 的參數說明
– ps 提供了很多的選項參數,常用的有以下幾個:
– l 長格式輸出;
– u 按用戶名和啓動時間的順序來顯示進程;
– j 用任務格式來顯示進程;
– f 用樹形格式來顯示進程;
– a 顯示所有與終端關聯的用戶進程;
– e 顯示所有進程
– x 顯示無控制終端的進程;
– r 顯示運行中的進程;
– ww 避免詳細參數被截斷;
• 最常用是aux 或 el
#: ps -aux
注意:
ps-aux 或 lax 輸出的解釋
• USER 進程的屬主;
• PID 進程的ID;
• PPID 父進程;
• %CPU 進程佔用的CPU百分比;
• %MEM 佔用內存的百分比;
• NI 進程的NICE值,數值大,表示較少佔用CPU時間;
• VSZ 進程虛擬大小;
• RSS 駐留中頁的數量;
• TTY 終端ID
• STAT 進程狀態(有以下幾種)
1)WCHAN 正在等待的進程資源;
2)START 啓動進程的時間;
3)TIME 進程消耗CPU的時間;
4)COMMAND 命令的名稱和參數;
其中:
• ps STAT 進程狀態
1)D 無法中斷的休眠狀態(通常 IO 的進程);
2)R 正在運行可中在隊列中可過行的;
3)S 處於休眠狀態;
4)T 停止或被追蹤;
5)W 進入內存交換(從內核2.6開始無效);
6)X 死掉的進程(從來沒見過);
7)Z 殭屍進程;
2.top 動態查看進程狀態
• 語法: top [-] [d delay] [q] [c] [s] [S]
• 參數
1、d 指定每兩次屏幕信息刷新之間的時間間隔。當然用戶可以
使用s交互命令來改變之。
2、q 該選項將使top沒有任何延遲的進行刷新。如果調用程序有
超級用戶權限,那幺top將以儘可能高的優先級運行。
3、S 指定累計模式。
4、s 使top命令在安全模式中運行。這將去除交互命令所帶來的
潛在危險。
5、i 使top不顯示任何閒置或者僵死進程。
6、c 顯示整個命令行而不只是顯示命令名
• 實例:
1、top
2、top –d 5 #間隔5秒刷新
3.df 查看文件系統空間
• 語法: df [option]
df 命令是報告文件系統空間使用情況最可靠的命令
• 命令行參數
1、a:顯示全部的檔案系統和各分割區的磁盤使用情形
2、i:顯示i -nodes的使用量
3、k:大小用k來表示 (默認值)
4、t:顯示某一個檔案系統的所有分割區磁盤使用量
5、x:顯示不是某一個檔案系統的所有分割區磁盤使用量
6、T:顯示每個分割區所屬的檔案系統名稱
7、H:使用「Human-readable」的輸出,也就是在檔案系統大小使用
GB、MB 等易讀的格式
• 實例
df -hi
4.du計算文件或目錄佔用空間
• 語法 du [option] [目錄/文件]
這是快快速檢查文件佔用情況的穩定工具
• 命令選項
1、a:顯示全部目錄和其次目錄下的每個檔案所佔的磁盤空間
2、b:大小用bytes來表示 (默認值爲k bytes)
3、c:最後再加上總計 (默認值)
4、s:只顯示各檔案大小的總合
5、x:只計算同屬同一個檔案系統的檔案
6、L:計算所有的檔案大小
• 實例
du -a
5.free 顯示內存狀態
• 語法: free [-bkmotV][-s <間隔秒數>]
free指令會顯示內存的使用情況,包括實體內存,虛擬的交換文
件內存,共享內存區段,以及系統核心使用的緩衝區等。
• 命令選項
1、-b 以Byte爲單位顯示內存使用情況。
2、-k 以KB爲單位顯示內存使用情況。
3、-m 以MB爲單位顯示內存使用情況。
4、-o 不顯示緩衝區調節列。
5、-s<間隔秒數> 持續觀察內存使用狀況。
6、-t 顯示內存總和列。
7、-V 顯示版本信息。
• 示例
1、free
2、free –s 2
6.man 查看命令聯機幫助
• 語法: man [option] <關鍵字>
manual(手冊)的縮寫,man相當於Windows的幫助文件
• 命令選項
1、-a 查詢所有同名的命令或系統調用,
2、-w 顯示聯機幫助對應的文本文件名
3、如果是數字,表示查詢的版本.
• man 實例
1、 man read
查詢read爲關鍵字的聯機文檔,如果有多個結果,只顯示第一個結果
2、 man –a read
1)、查詢所有以read爲關鍵字的命令或系統調用
2)、比如read,即是一個命令又是一個系統調用,如果只是man read,每
次只能查到第一個聯機,如果想看後面的,可以上述命令,查到第一個,
按q退出,顯示就是第二個查詢結果
3、 man –aw read
查詢所有read相關的信息對應的幫助文件名
4、 man 2 read
直接查詢read的第二個聯機幫助
• man的交互操作
man在進入查詢結果,可以類似vi的末行操作,可以在屏幕最後一行輸入一些命令,作簡單交互操作.
1、[q] 退出;
2、[Enter] 一行行地下翻;
3、[Space] 一頁頁地下翻;
4、[b] 上翻一頁;
5、[/] 後跟一個字符串和[Enter]來查找字符串;
• /write #在文檔中查找write關鍵字
6、[n] 發現上一次查找的下一個匹配。

使用頻率最高一些命令

• ls –l                 //查看文件/目錄詳細信息
• rm –rf mydir          //強制刪除mydir目錄
• rm –f                 //強制刪除
• tar xvzf              //解壓
• tar cvzf              //壓縮
• mv                    //移動、重命名文件/目錄
• cd                    //切換目錄
• chmod                 //修改權限
• grep                  //文本內容查找
• find                  //搜索命令
• df                    //查看文件系統佔用空間
• free                  //查看內存
• ifconfig eth0 ip地址  //修改ip地址
• ping                  //檢查網絡連通性
• ps –aux (-el)       //查看進程
• man                   //查詢幫助

六、shell腳本(.bash/.sh)

  1. 用cat /etc/shells可以顯示系統安裝的Shell.
  2. shell是一個可以一次性執行的可執行文件,即*.sh //相當於*.bat
  3. 腳本格式
    1)shell腳本必須爲Unix文本文件
    2)shell腳本的第一句必須指定解釋的shell或者空行
    • 通常固定格式爲:#!/bin/sh
    • #號及其後面跟隨的同一行的所有內容都被忽略
    3)shell腳本必須有可執行權限
    4)$,*,\’,\是腳本保留字符,要使用需用右斜槓
    5)#語句 //#號就是註釋的意思
  4. 變量類型
    1)系統變量
    2)環境變量
    3)自定義變量
    eg:
        myfile="123"  #給myfile變量賦值
        echo ${myfile}  #輸出myfile的值
    變量特點:
        1)所有變量不用定義可以直接使用
        2)所有變量值都是字符類型
  1. 注意’字符串’和 “字符串” 意義不同
    echo ‘字符串’ #’'裏的字符串按原樣輸出
    echo “字符串” #""裏的字符串若是變量即輸出值,無則原樣輸出
  2. 自定義變量
        var=12
        echo ${var:-13} #-表示空值置換
        #輸出:12
        #相當於:var==NULL ? 13 : var
        #如果var的值爲空,則輸出13其中var的值沒變,否則爲var的值
========其它表達式的含義======
        echo ${var:=value}  //空值置換,若爲空則給var賦值並輸出
        echo ${var:?}   //空值出錯,若爲空顯示系統提示的錯誤信息
        echo ${var:?"err"}  //若爲空,則顯示自定義的提示的錯誤信息
        echo ${var:+value}  //有值置換,若有值則輸出置換後的值
  1. 環境變量
    //shell 環境變量是所有shell 程序都會接收的參數。
    1)PATH 命令搜索路徑,以冒號爲分隔符.注意與DOS下不同的是,當前目錄不在系統路徑裏
    2)HOME 用戶home目錄的路徑名,是cd命令的默認參數
    3)IFS 定義SHELL使用的分隔符 ,指命令行參數分隔符IFS=$’ \t\n’
    4)LOGNAME 用戶登錄名
    5)SHELL SHELL的路徑名
    6)TERM 終端類型 LD_LIBRARY_PATH 尋找庫的路徑,以冒號分隔
    用法:(直接在終端下操作)
    export LOGNAME //自定義一個環境變量
    echo LOGNAME //輸出當前的用戶登錄名
    輸出:root  //當前用戶是是哪個用戶就輸出哪個用戶名

其它用法:
1)export PATH=/home/atao:$PATH //將目錄添加到了環境變量路徑中
2)unset 變量名 //取消該定義的變量
【補充】
1)export //表示設置指定的環境變量
2)unset //用於取消環境變量和自定義的變量
8. 常用系統變量

    $n $1表示第一個參數    $2表示第二個參數    ...
    $# 顯示命令行參數的個數
    $0 顯示當前程序的名稱
    $? 前一個命令或函數的返回值
    $* 以"參數1 參數2 ..."形式保存所有參數
    $@ 以"參數1" "參數2" ... 形式保存所有參數
    $$ 本程序的(進程ID號)PID
    $! 上一個命令的PID
    用法:echo "$$"
  1. 表達式的運算達
    格式:$((表達式))
    eg: echo $((1 + 3)) #輸出:4
    *其中兩種不同的將字符串當成數學表達式的關鍵字//let和expr
        1)let num=1+3
            echo $num   #輸出:4
        2)num=`expr 1 + 3`
            echo $num   #輸出:4
    #注意:`這個字符是Esc鍵下的那個字符,不是單引號.
  1. $(())支持多進制的表示
    八進制$((08))
    十六進制$((0x16))
  2. $((進制數#數字))任意進制的表示
    echo $((2#1101010)) #2進製表示
    echo $((8#377)) #8進製表示
    echo $((16#D8)) #16進製表示
    echo $((12#10)) #12進製表示
    echo $((36#ZZYY)) #36進製表示

條件判斷

  1. 文件比較運算符
    -e filename //如果 filename存在,則爲真
    -d filename //如果 filename爲目錄,則爲真
    -f filename //如果 filename爲常規文件,則爲真
    -L filename //如果 filename爲符號鏈接,則爲真
    -r filename //如果 filename可讀,則爲真
    -w filename //如果 filename可寫,則爲真
    -x filename //如果 filename可執行,則爲真
    filename1 -nt filename2 //如果 filename1比 filename2新,則爲真 
    filename1 -ot filename2 //如果 filename1比 filename2舊,則爲真
  1. 字符串比較運算符
    -z string //如果 string長度爲零,則爲真 
    -n string //如果 string長度非零,則爲真
    string1 = string2 //如果 string1與 string2相同,則爲真
    string1 != string2 //如果 string1與 string2不同,則爲真
  1. 算術比較運算符
    num1 -eq num2 //等於         [ 3 -eq $mynum ]
    num1 -ne num2 //不等於       [ 3 -ne $mynum ]
    num1 -lt num2 //小於         [ 3 -lt $mynum ]
    num1 -le num2 //小於或等於   [ 3 -le $mynum ]
    num1 -gt num2 //大於         [ 3 -gt $mynum ]
    num1 -ge num2 //大於或等於   [ 3 -ge $mynum ]

判斷表達式是否爲真的兩種表示方法

  1. test和[] //返回0成功,返回1失敗
    方法一:test 表達式
    eg:test 1 -eq 0 #表達式爲假
    方法二:[ 表達式 ]
    eg: [ 1 -eq 0 ] #表達式爲假

二種分支語句

  1. if和case
    1. if/then/else/fi或者if/then/elif/fi
      用法:
   if [ -d /home/atao/demo1 ]
        then
            echo true
        else
            echo false
    fi
    #如果demo1目錄存在就執行then後面的語句,否則執行else後的語句

等同於

       1) [ -d /home/atao/demo1 ] && echo true || echo false
       2) test -d /home/atao/demo1 && echo true || echo false 
  1. case 字符串 in; 模式1) 語句;;模式2) 語句;;esac
    其中:模式可以有多個值,用|分開 如1|2|3|4|5)
    用法:
   echo -n "please input option:"   #提示輸入信息
   read input_s #從鍵盤輸入
   case "$input_s" in   #判斷入口
        1)echo "Linux";;
        2)echo "Windows";;
        3)echo "Ubuntu";;
        *)echo "input_s $input_s choice err"    #*)相當於default
        exit 1  #錯誤則返回1
    esac

三種循環語句

  1. for 判斷表達式 ;do 語句;done
    #!/bin/sh
    1)for((x=1; x<5; x++))
        do
            echo "num $x=$x"
        done
    2)for x in 123 "abc" "666"
        do
            echo ${x}
        done
  1. while 判斷表達式; do 語句;done
   #!/bin/sh
    x=1
    while((x<=10))
        do
            echo "Hello x is $x"
            let x=x+1   #相當於x++
        done
  1. until 判斷表達式;do 語句;done
    翻譯:until=直到…爲止
    功能描述:重複循環直到條件爲真爲止
   i=0
    until [ $i -ge 20] #當i>=20的時候循環
        do
            i=$(($i+1))
            echo $i
        done
  1. shift命令
    功能描述:循環從命令行參數位置變量值取一個值出來,並且把總數減一
    • shift後可加整數進行一次多個移位
    eg:shift 3
    • 用法:
    until [ $# -eq 0 ]  #從終端獲取參數,當參數總數等於0終止循環
        do
            echo "value=$1 count=$#"
            shift 3 #每次向後移動3個位置
        done
    #注意命令行參數總數,$#每shift一次,值減3

三種跳出機制

  1. break
    break [n]
    //中止循環過程的執行,並跳到下一個命令。N表示跳出嵌套的層數
  2. continue
    continue [n]
    //停止循環過程的當前一個反覆並且跳到循環中的下一個反覆過程的開始部分,n表示忽略的層數
  3. exit
    exit [n]
    //停止shell程序的執行,並且將返回值設置爲n。

shell函數

  1. 不能單獨寫在一個腳本里,至少有一個調用語句
  2. 實例
    #!/bin/sh
    show()
    {
        echo "output show $*"   #輸出參數表
    }
    echo "Hello kitty"
    #調用show()函數,記住在定義函數的腳本里,至少要調用一次
    show 123 "abc" "666"
    echo "============"
    echo $*
    echo $1

交互式腳本(輸入輸出)

  1. echo 輸出語句
  2. read 變量名
    常用參數:read -p “提示信息” //每次輸入時read提示
    用法 :
#!/bin/sh
read -p "Please input var = " var
echo "var = ${var}"
  1. 從管道里讀取
    #!/bin/sh
    #read讀取一個變量
    ls | while read file    #默認在本目錄循環讀取文件
        do
            ls $file    #顯示讀取到的文件
        done
    #!/bin/sh 
    #read可一次性讀取多個變量
    #默認在本目錄中分別讀取文件名和文件對應的id號
    ls -i | while read file id 
        do
            #file存的是文件名,id存的是文件對應的節點號
            echo "File is $file ID is $id" 
        done
  1. select 表達式是bash的擴展應用,用戶可以從一組不同的值中進行選擇
    翻譯:select 選擇
    語法結構:
    #!/bin/sh
    select var in "Linux" "Windows" "Ubuntu"
        do
            break
        done
    echo "You have selected $var"
輸出:
    1) Linux
    2) Windows
    3) Ubuntu
    #? 1
    You have selected Linux

腳本調試

//直接在終端下輸入命令

  1. sh -x 命令
    •功能描述:執行該腳本並顯示所有變量的值。
    1. sh -x name.sh #sh表示運行
    2. bash -x name.sh #與上述功能一樣,表示運行
  2. sh -n 命令
    •功能描述:不執行,只執行語法檢查
    sh -n name.sh #運行後不報錯表示沒錯誤
  3. trap 命令
    • 功能描述:令用於捕獲指定的信號並執行預定義的命令。
    • 用法
    trap ‘command’ signal
    //其中signal是要捕獲的信號,command是捕獲到指定的信號之後,所要執行的命令。可以用kill–l命令看到系統中全部可用的信號名,捕獲信號後所執行的命令可以是任何一條或多條合法的shell語句,也可以是一個函數名。
    • Shell僞信號
    1)EXIT 從一個函數中退出或整個腳本執行完畢
    2)ERR 當一條命令返回非零狀態時(代表命令執行不成功)
    3)DEBUG 腳本中每一條命令執行之前
    • (DEBUG)對相關變量的全程跟蹤
    trap ‘echo “before execute line:LINENO,a=LINENO, a=a,b=b,c=b,c=c”’ DEBUG
    • (EXIT)判斷腳本的執行狀態以及出錯原因
    trap ‘command’ EXIT 或 trap ‘command’ 0
    • (ERR)追蹤執行不成功的命令或函數,並輸出相關的調試信息
    trap ‘ERRTRAP $LINENO’ ERR

系統的幾個腳本

  1. init腳本的存儲目錄
    • /etc/rc ,/etc/rc.d/init.d 或者 /etc/init.d 目錄下
    2./sbin/service 用於控制各種服務的啓動和停止
    用法:
    • /sbin/service smb restart #重啓smb服務器

七、gcc相關編譯工具

//gcc一般安裝在/usr/bin

  1. 編譯一個程序的完整
    1)編寫源文件 .cpp/.c
    2)預編譯->將頭文件進行預處理 *.i
    3)編譯->將源代碼編譯生成彙編代碼 *.s
    4)彙編->彙編代碼生成目標代碼 *.o
    5)鏈接->對所有文件進行鏈接生成可執行文件 *.out/*.o
  2. gcc支持的文件格式
    1)*.c c語言源程序
    2)*.c/.cc/.cxx/.cpp C++源程序
    3)*.m Objective-C源程序
    4)*.i 預處理後的C文件
    5)*.ii 預處理後的C++文件
    6)*.s/.S 彙編語言源程序
    7)*.h 預處理器文件
    • 其它格式:
    *.o 目標文件(Object file)
    *.a 歸檔庫文件(Archive file)
  3. gcc進行的操作
    1)gcc 調用cpp進行預處理
    2)gcc 調用cc1進行編譯,會生成彙編代碼
    3)gcc 調用as 對彙編代碼,生成擴展名爲.o的目標文件
    4)gcc 調用ld 來完成對所有目標文件的鏈接
  4. 編譯實例
    格式:gcc 源代碼.c -o 自定義輸出名.out
    //若不指定輸出名,默認輸出a.out
  5. 用gcc編譯單個文件
    1)進行預編譯
    gcc -E main.c -o main.i
    2)將c代碼編譯成彙編代碼
    gcc -S main.i -o main.s
    3)將彙編代碼生成目標代碼
    gcc -c main.s -o main.o
    4)將生成的目標文件鏈接生成可執行文件
    gcc main.o -o main.out
    • 其它參數
    -v 顯示執行編譯階段的命令.同時顯示編譯器驅動程序,預處理器,編譯器的版本號.
    6. 用gcc編譯一個工程文件,即多個文件
    • 格式:gcc -I頭文件目錄 源目錄文件 -o 輸出文件
    gcc -I./atao/HeaderFiles/ ./atao/SoucreFiles/
    .c -o main.out
    #當有多個頭文件時要多次使用[-I目錄]
  6. file文件分析命令
    用法:file 文件
    • 結果分析中英文解析
    1)not stripped //包含調試信息
    2)relocatable //目標文件格式
    3)executable //表示是可執行文件
    4)Inter 80386 //CPU
    5)dynamically linked //動態鏈接版本
    • 其中
    #:strip 可執行文件 //可清除gcc -g 源代碼.c的調試信息
  7. 警告提示功能(直接在終端下執行)
    1)-Wall //打開所有有用的編譯警告
    2)-Werror //視警告爲錯誤,出現任何警告即放棄編譯
    3)-w //禁止輸出警告信息
    • 常用組合
    #:gcc -Wall -Werror 源文件.c -o 輸出文件.out
  8. 宏選項(直接在終端下執行)
    • 語法結構
    1)定義宏的內容爲等號後面的字符串 //相當於在代碼裏的#define
    #:gcc 源文件.c -D__宏名=字符串 -o 輸出文件.out(執行文件)
    //注意-D後面沒空格時要加兩個下劃線
    或者
    #:gcc 源文件.c -D 宏名=字符串 -o 輸出文件.out(執行文件)
    //注意:-D後面有空格時直接加宏名
    2)取消宏的定義,-U選項在所有的-D選項之後
    #:gcc 源文件.c -U 宏名 -o 輸出文件.out(執行文件)
    • 注意
    //在一個gcc語句中,-D只能定義一個宏,多個宏需要多個-D來定義.
  9. 庫的鏈接
    //#:set 回車 //查看系統已定義了的環境變量
    1)兩種函數庫
    • 靜態庫 *.a
    特點:生成的文件較大,但運行時就不用再需要庫文件了.
    • 動態庫 *.so
    特點:編譯並沒有鏈接庫,而是程序執行運行時時鏈接文件加載庫
注意:
    Linux下的庫文件命名時有一個規定:必須以“lib”開頭.因此-l選項指定
鏈接庫文件時可以省去"lib"這個庫文件名頭.
  1. 靜態庫的創建:(可以不用把主函數生成目標文件)
#:gcc -I./HeaderFiles -c ./SoucreFiles/main.c -o  ./Debug/main.o
#:gcc -I./HeaderFiles -c ./SoucreFiles/fun.c -o ./Debug/fun.o
    //生成目標代碼
#:ar -crsv libmydll.a ./Debug/*.o
    //創建靜態庫文件,叫:mydll
#:gcc -I./HeaderFiles ./SoucreFiles/main.c -L./ -lmydll -o run.out
    //鏈接動態庫,並生成可執行文件
    //其中,-L創建的庫所在的目錄 
            -l自定義的庫名,不用加後綴==lib自定義的庫名.a
【參數】
- r //將目標代碼插入到檔案文件中(下面有介紹).
- v //顯示ar操作的附加信息.
- c //創建庫,增加索引信息.
- s //表示創建的是靜態庫
  1. 動態庫的創建
    • 隱式調用
#:gcc -fpic -I./HeaderFiles -c ./SoucreFiles/fun.c -o ./Debug/fun.o
    //將自定義函數編譯成目標文件
#:gcc -shared ./Debug/fun.o -o ./librundll.so
    //將自定義函數的目標文件加入到自定義的動態庫文件中
#:gcc -I./HeaderFiles ./SoucreFiles/main.c -L./ -lrundll -Wl,-rpath,$(pwd) -o ./Debug/main.out
    //調用動態庫文件並生成可執行文件
【參數】
-fpic //編譯目標文件時,帶上-fpic標誌,使輸出的對象塊是按照可重定位地址方式生成的
-shared //必須帶上-shared,明確表示是動態鏈接庫
-Wl,-rpath機制就是將隨後的路徑寫入程序。優點就是執行簡單,缺點就是編譯環境和運行環境的庫路徑要完全一樣,不能修改。
• 顯式調用
    #include <dlfcn.h> //1.導入頭文件
    int main(void)
    {
        void *phandle = NULL; //2.定義動態庫操作句柄
        void *pshow = NULL;
        phandle = dlopen("./libmydll.so", RTLD_LAZY);//3.打開動態庫
        /*
        參數一是自定義的動態庫名,參數二是指定如何打開共享庫文件
        其中:
        RTLD_NOW:將共享庫中的所有函數加載到內存
        RTLD_LAZY:延遲加載庫操作,直到調用dlsym()時方加載某函數
        */
        pshow = dlsym(void *handle, char *symbol);
        //4.用dlsym取得對應庫函數的函數指針,相當於使用庫函數
        dlclose(phandle);//5.關閉句柄,釋放共享庫
        return 0;
    }
  1. 優化選項參數 -O數字(是大寫O)
    1)用法:
    #:gcc -O2 源文件.c  //將源文件.c的代碼優化,級別爲2
    //優化級別的數字爲:0~3
注意:
   • 優化等級一般-O1就可以了
   • 只有最終發行時才考慮優化,中途優化時代碼可能被調整
2)time命令測試程序運行的時間 
• 用法:time 程序名
    #:time main.out

//運行後包含的信息 :
real 0m0.004s //程序本身運行所需時間
user 0m0.000s
sys 0m0.000s
12. GNU工具集GNU binutils
//是一套用來構造和使用二進制所需的工具集.
1)輔助工具

addr2line //將地址轉換成文件名或行號對,以便調試
eg#:addr2line 內存地址 -e 目標程序
//將一個進程內地址轉換源碼文件裏某一行,這樣方便調試
ar //用於建立、修改、提取檔案文件,用於建靜態庫
file //file命令用來判別文件類型
nm //列出目標文件中的符號   
eg#:nm 可執行文件.out
objcopy //可將一種格式的目標文件轉爲另一種格式的目標文件
eg#:objcopy -O 指定輸出文件類型 源文件 輸出文件
objdump //將c程序反彙編,用來顯示目標文件信息,可通過選項控制顯示那些特定信息
eg1#:objdump -f 可執行文件.o //顯示目標文件的頭部概要信息
eg2#:objdump -d 可執行文件.o //顯示目標文件中機器指令使用的彙編語言.只反彙編那些應該含有指令機器碼的節(顯示.text段)
eg3#:objdump -D 可執行文件.o //反彙編所有節的內容
eg4#:objdump -x 目標文件 | grep NEEDED
eg5#:objdump -x 目標文件 | grep NEED
//不需運行起程序;可以查看動態庫和目標文件依賴。
ranlib //生成索引以加快對歸檔文件的訪問,並將結果保存到這個歸檔文件中
readelf //用來顯示ELF格式目標文件的信息
eg1#:readelf -h 可執行文件 //讀取ELF頭信息
eg2#:readelf -a 可執行文件 //讀取所有的ELF信息
eg3#:readelf -a 可執行文件 | grep NEEDED
//與objdump一樣,也可查看目標文件的依賴
size //顯示歸檔文件和目標文件的各段尺寸
eg#:size 可執行文件  //查看該文件各段的尺寸大小
//執行命令後結果中:- Dec表示10進制的各段的尺寸之和
strings //顯示文件中可打印文本信息
strip //清除可執行文件的符號和調試信息
windres //windows資源編譯器
gprof //用來測量程序的性能,能記錄每個函數被調用的次數以及相應的執行時間。有助於針對性的優化程序
2)nm運行後顯示結果的參數解析
A//符號的值是絕對值,並且不會被將來的鏈接改變
B//全局變量,符號位於未初始化數據部分(BSS段)
b//靜態變量
C//公共的,若其它地方被定義,則會當成引用處理
D//全局變量,符號位於已初始化數據部分
d//靜態變量
T//符號位於代碼部分
U//符號未被定義,通常是外部庫函數
://符號類型未知,或者目標文件格式特殊

八、網絡命令

  1. [任意在線用戶]
    功能描述:給指定的在線用戶發送消息
    eg#:write atao
    //命令執行後就可以輸入消息內容了,然後按Ctrl+D保存發送並退出
  2. wall [消息內容]
    功能描述:給所有在線用戶發送廣播消息
    eg#:wall 你好,世界
  3. mail [收信用戶]
    • 功能描述:給指定用戶發送郵件
    eg#:操作步驟如下
    1)mail atao 回車
    2)Subject:郵件標題 回車
    3)輸入郵件內容
    4)按Ctrl+D 發送並退出
    • 查看郵件
    在終端下執行命令#:mail 回車
    其中:
    1 //按1,即郵件序號可以查看郵件內容
    h //按h, 查看郵件列表,即有哪些郵件
    d 1 //按d + 序號,表示刪除序號爲幾的郵件
    q //按q 退出郵件
  4. last命令
    功能描述:查看目前及過去登入系統的用戶信息
    eg#:last 回車
  5. lastlog命令
    功能描述:查看最後登入系統的用戶信息
    eg#:lastlog 回車
    其中:只查看某一用戶登入系統的信息
    命令:lastlog -u 用戶的ID號
    eg#:lastlog -u 502 //表示只查看ID號爲502的用戶登入信息
  6. traceroute [網址]
    功能描述:跟蹤路由。查看本機到達某一指定網站所經過的路徑
    eg#:traceroute www.baidu.com //查看本機到達百度所經過的路徑
  7. netstat [參數]
    功能描述:查看網絡相關信息
    參數:
    -t //TCP協議
    -u //UTP協議
    -l //監聽
    -r //路由
    -n //顯示IP地址和端口號
常用組合:
    eg1#:netstat -tlun  //查看本機監聽的端口
    eg2#:netstat -an    //查看本機所有的網絡連接
    eg3#:netstat -rm    //查看本機路由表
  1. mount掛載命令
    功能描述:手動連接外接設置,如光驅,U盤等
    語法結構:mount [-t 文件系統] 設置文件名 掛載點
    或者:mount 設置名稱 掛載點 //因爲文件系統一般是已經默認的
    卸除掛載點:umount 設置文件/掛載點
    操作步驟:
    1)#:mkdir /mnt/cdrom  //創建一個目錄用來掛載
    2)#:mount -t iso9660 /dev/sro /mnt/cdrom 
    //將設備文件中的光驅設備目錄文件/dev/sro掛載到建立的掛載目錄
    或者:mount /dev/sro /mnt/cdrom
    3)cd /mnt/cdrom/    //然後就可以訪問這個光盤裏的文件了
    4)umount /dev/sro   //用完之後要記得彈出光驅,即卸除掛載點
  1. setup命令(永久更改IP地址)
    功能描述:配置網絡
    eg#:setup 回車 //進入網絡配置界面
    ====最後記得重啓服務
    #:service network restart //重新啓動網卡
    10.netconfig命令
    功能描述:在圖形界面中永久更改ip地址信息
    語法結構:netconfig 回車
    ====最後記得重啓服務
    #:service network restart //重新啓動網卡
    11.修改網卡的配置文件(永久更改ip地址信息)
    vim /etc/sysconfig/network-scripts/ifcfg-網卡0
    ====最後記得重啓服務
    #:service network restart //重新啓動網卡

九、 啓動配置文件

  1. 兩種修改方式
    1. #:vim /etc/inittab
      //可以修改啓動模式,如3 命令行模式 5 圖形界面模式
      2)#init 數字
    0 //關機
    1 //單用戶
    2 //不完全多用戶,不含NFS服務,即不包含網絡服務的命令行模式
    3 //完全多用戶,即純命令行模式
    4 //未分配
    5 //圖形化界面模式
    6 //重啓
  1. runlevel查詢系統運行級別(模式)
    eg#:runlevel 回車
  2. logout退出登錄命令
    功能描述:相當於鎖屏功能
    eg#:logout 回車

十、 vim編輯器

  1. 常用命令
:set nu //設置行號
:set nonu //取消行號
:數字 //定位到第幾行
gg //跳到第一行
G //跳到最後一行
dd //刪除光標所在的行,ndd 表示刪除光標以下的n行
D //刪除光標所在處到行尾的內容
yy //複製光標所在行
nyy //複製當前行以下的n行
dd //剪切當前行
ndd //剪切當前行以下的n行
p //粘貼
u //撤消
/搜索詞 //搜索指定的搜索詞
:w 另存爲文件名 //另存爲指定的文件
  1. 小技巧命令
1):r 文件名 //在當前文件的光標處導入指定的文件中的內容 如:r ./text 
2):!which 命令 //可以在當前文本內使用查詢命令 如:!which ls
3):r !命令 //將命令結果插入到當前文本的光標所在處 如:r !who
4):map Ctrl+v+自定義的快捷鍵字母 要完成的功能 //自定義快捷鍵 
//如:map Ctrl+v+h iHello,world<ESC> 
//表示當按下Ctrl+h鍵的時候在光標處插入了Hello,world字符,並即出編輯
5):1,4s/^/#/g //表示在1-4行的行首插入一個註釋字符#
//格式:數字,數字s/^/要插入的字符/g
//其中^表示行首 g表示不用確認
6):1,4s/^#//g //表示將行首的#號去掉
7):ab 字符1 字符2   //替換命令
//表示在編輯模式中當輸入字符1的時候自動替換成字符2
  1. 修改編輯模式中的配置文件(.vimrc)
    方法:vim /home/username/.vimrc
    //配置文件一般存放在用戶的.vimrc文件中

十一、makefile自動編譯管理器

//它能夠根據文件時間戳自動發現更新過的文件而減少編譯工作量

  1. 更新文件修改時間的方法
    命令:#:touch * //將所有文件時間調爲當前時間
  2. 語法格式
    • 注意
    1)每一行命令行的行首必須是一個跳格字符(即tab)
    2)如果命令行過長,可用\分行,分行後的新行,無需使用tab打頭
    • 格式爲:(首先要創建makefile文件)
    all : 可執行文件.out
    目標名稱 : [依賴文件*.c/*.h/*.o]
    <Tab>命令語句1
    <Tab>命令語句2
    ...
    clean :
    <Tab>-rm -fr 需刪除的文件
all : main.out
fun.o : header.h fun.c  
    gcc -I./ -c ./fun.c -o ./fun.o
main.out : header.h fun.o main.c
    gcc -I./ ./main.c ./fun.o -o ./main.out
    
clean :
    -rm -fr ./*.o
• 其它注意的格式(在make腳本文件中)
1)"@"的使用
含義:在語句開頭表示在編譯時不顯示執行過程,只顯示輸出結果
如: @gcc .I./HeaderFiles ./SoucreFiles/main.c -o ./main.out
2)"-"的使用
含義:在語句開頭表示在編譯時忽略錯誤繼續往下執行,否則終止
如:-gcc .I./HeaderFiles ./SoucreFiles/main.c -o ./main.out
    echo "Hello, world!"
  1. .PHONY關鍵字來聲明僞目標
    eg:.PHONY clean,install,all #表示三個都是僞目標
    1)make 內置的一些常用的僞目標.
clean 清除項目生成的中間文件和最終成文件
install 項目如何安裝
.uninstall 項目如何卸載
  1. make的調用
    1)#:make 回車
    //這是默認的調用方式,make編譯器會在當前目錄自動尋找
    2)#:make -f mymakefile
    //這是指定了文件名,make編譯器尋找指定的make文件名
    3)#:make -C /home/atao/makefiles/
    //這是指定了make文件所在的目錄
  2. 只編譯特定部分
    1)當一個項目有多個版本或不同的部分,在makeflie裏用target(目標)表示.即:在makefile裏寫在(冒號)前面的文件
    2)可以在終端命令裏用make命令後面加目標,對多個目標進行編譯.
    eg1#:make all
    eg2#:make clean
    eg3#:make install
    eg4#:make uninstall
    eg5#:make 目標1 目標2 目標3 ...
  1. makefile變量
    1)功能描述:當要以相同的編譯選項同時編譯多個源文件時,可以定義makefile變量代替重複出現的編譯或命令。(即替換的a)
    2)實例代碼如下
CCG = gcc
HEAD = -I./
all : main.out
main.out : header.h main.c
    $(CCG) $(HEAD) ./main.c -o main.out
3)格式注意與shell變量定義相反
• make定義變量時=(等號)兩邊要加空格,而shell不需要.
• make用$(變量)來保護變量,而shell用${變量}保護變量.
• make變量的定義一般放在最前面,即規則之前.
• Makefile中,可以用export 把自己的變量變成環境變量.
• Makefile變量分爲自定義變量、預定義變量和自動變量.

注意:
一般在makefile中定義時採用:
VAR := value
//(:=)的方式,只會展開一次,消除了無窮遞歸展開的方式.
4)預定義變量(可以直接在makefile裏使用,也可覆蓋)

    – AR 歸檔維護程序的名稱,默認值爲 ar。
    – ARFLAGS 歸檔維護程序的選項,無默認值。
    – CC C 編譯器的名稱,默認值爲 cc。
    – CFLAGS C 編譯器的選項,無默認值。
    – LDFLAGS C 鏈接器的選項,無默認值。
    – RM 文件刪除程序名稱,默認值爲rm –f。
    – CXX C++ 編譯器的名稱,默認值爲 g++。
    – CXXFLAGS C++ 編譯器的選項。
5)自動變量
– $< 第一個依賴文件的名稱。
– $@ 目標的完整名稱。
– $^ 所有的依賴文件,以空格分開,不包含重複的依賴文件。
– $* 不包含擴展名的目標文件名稱。
– $+ 所有的依賴文件,以空格分開,並以出現的先後爲序,可能包含重複的依賴文件。
– $? 所有的依賴文件,以空格分開,這些依賴文件的修改日期比目標的創建日期晚。
– $% 如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱。例如,如果目標名稱爲 mytarget.so(image.o),則$@爲mytarget.so,而$%爲image.o。

6)變量替換
//替換引用是用指定的變量替換一個變量的值.(一般替換結尾的部分)
如:將後綴.c的文件替換爲後綴爲.o的文件
fun := a.c b.c
bar := $(fun : .c = .o)
7)引用其它的makefile
語法結構 :include makefile1 makefile2 makefile3
//多個文件用空格分隔,可以包含路徑或通配符
7. makefile裏的條件控制
1)注意
• make的條件控制實際只能控制makefile裏的命令執行部分,不能控制規則的shell命令執行過程
• 條件語句可以是兩個不同變量、或者變量和常量值的比較
2)語法

#方法一:
ifeq (變量1, 變量2)
    語句1
else 
    語句2
endif
#方法二:
ifdef 值
    語句
endif
#實例
ifdef 1
    ifeq (4, 5)
        echo "4 等於 5"
    else 
        echo "不相等"
    endif
endif
  1. makefile中的函數
    1)常用的一個函數origin函數
    • 語法結構:echo $(origin 變量)
    • origin函數的返回值:
undefined //表示該變量從未定義過
default //表示該變量是默認的定義
environment //是環境變量,並且當Makefile被執行時,"-e"參數未打開。
file //說明定義在當前makefile中
command line //這個變量是被命令行定義的
override //說明該變量是被override指示符重新定義的
automatic //是一個命令運行中的自動化變量
  1. 基於Makefile的開源項目
    • 典型例子
    1)tree,分顏色顯示目錄樹的命令行工具.
    2)rzsz ,利用串口傳輸文件的工具.可移植到ARM開發板
    3)tftp-hpa ,TFTP客戶端,可以移植到ARM開發板

十二、autotools自動生成makefile文件

  1. 生成流程
    1)運行autoscan命令
    2)將conigure.scan文件重命名爲configure.in,並修改該文件
    3)在project目錄下新建makefile.am文件,並在core和shell目錄下也新建makefile.am文件
    4)運行aclocal命令,生成m4宏文件
    5)運行autoconf命令,生成configure文件
    6)運行automake -a命令,生成makefile.in
    7)運行./configure腳本,讀入makefile.in生成makefile
  2. 實例操作步驟(靜態庫的應用)
    前提:已經寫好了源程序
    1)在終端下運行#:autoscan命令
    2)執行改名命令#:mv conigure.scan conigure.in
    3)新建三個makefile.am文件。分別是頂層目錄,源目錄,頭文件目錄
    4)配置頂層目錄裏的makefile.am文件。如下
• AUTOMAKE_OPTIONS=foreign
#指定automake代碼級別,這裏的級別爲foreign
• SUBDIRS=SourceFiles HeaderFiles
#指定需要的子目錄,只需寫目錄名即可,多個用空格分隔
• ROOT_DIR=$(shell /bin/pwd)
#定義變量用於獲取頂層路徑
• INCLUDES=-I$(ROOT_DIR)/HeaderFiles
• export INCLUDES
#指定頭文件所在的路徑,並導出供子目錄makefile.am使用
• bin_PROGRAMS=target
#指定要產生的執行文件名
• target_SOURCES=$(ROOT_DIR)/SourceFiles/main.c
#指定產生執行文件需要的源文件,即主函數main.c
• target_LDADD=$(ROOT_DIR)/SourceFiles/libname.a
#表示增加鏈接庫
5)配置SoucreFiles目錄裏的makefile.am
• noinst_LIBRARIES=libname.a
#在SourceFiles目錄裏生成靜態庫,以便頂層目錄文件鏈接使用
• libname_a_SOURCES=fun1.c fun2.c fun3.c ...
#將函數文件導入到靜態庫libname.a裏,以空格隔開
6)配置HeaderFiles目錄裏的makefile.am
• EXTRA_DIST=header.h
#EXTRA_DIST表示用來定義要額外打包的文件名稱
7)配置頂層目錄下的configure.in文件
• #:vim configure.in
• 修改AC_INIT宏,指定軟件包名稱/版本/bug報告路徑
AC_INIT(myautomake, 1.1.2, /home/atao/err/)
• 屏蔽AC_CONFIG_HEADER宏
#AC_CONFIG_HEADER
• 由於我們將要把SourceFiles目錄內的源文件編譯成靜態庫,所以需要加入一個宏
AC_PROG_RANLIB
• 加入automake必需的宏
AM_INIT_AUTOMAKE
8)開始使用autotools,使生成makefile
#生成configure文件
• #:aclocal
#爲autoconf產生處理本地宏的aclocal.m4文件
• #:autoconf
#生成makefile.in文件,其中--add-missing會自動添加重要腳本
• automake --add-missing
#產生makefile文件,讀入makefile.in文件生成makefile
• #:./configure
#使用makefile,執行編譯,並自動生成可執行文件
• #:make
#運行可執行文件
• #:target
9)大功告成
  1. 關於makefile的使用
#:make
/*
當執行編譯,產後可執行文件target
其中,automake默認的是:gcc -Wall O2 -g,
怎麼改爲我們實際需要的編譯選項?需使用如下命令:
方法一:configure:CFLAGS="-Wall -g" ./configure
方法二:當然也可以直接頂層Makefile.am中添加CFLAGS="-Wall -g"
*/
#:make install
//將可執行文件target安裝到系統目錄
#:make clean
//清除前一次編譯的目標文件(.o), 庫文件(.a),可執行文件
#:make distclean
//除了執行make clean的工作外,還會清除./x過程生成的文件
#:make dist
//將源程序和相關文檔打包成一個壓縮文檔以供發佈
  1. configure腳本選項
    • configure 有大量選項可供不同需求要求
– --help 查看所有選項
– --prefix=PEWFIX 輸入安裝目錄前綴. 
#: ./configure --prefix=/opt/gnu 
– CFLAGS=“-Wall -g” ./configue
– LDFLAGS=“-L –l -static” ./configue
– CC=“arm-linux-gcc” ./configue
– --host 
• 指定軟件運行的系統平臺.如果沒有指定,將會運行`config.guess‘來檢測.
如:arm通常用 –host=arm-linux
./configue --host=arm-linux --build=i386-linux 
– '--target=GARGET' – 指定軟件面向(targetto)的系統平臺.這主要在程序語言工具如編譯器和彙編器上下文中起作用.如果沒有指定,默認將使用'--host'選項的值 
  1. autotools製作動態庫的過程
    •操作步驟與製作靜態庫大體相似,但需要修改部分配置
1)在頂層目錄的configure.in文件裏的修改 
    用AC_PROG_LIBTOOL替換AC_PROG_RANLIB 
//表示利用libtool來自動生成動態庫
2)修改頂層目錄和SourceFiles目錄裏的makefile.am文件
    a)在頂層目錄裏將libname.a修改爲libname.la
    b)在SourceFiles裏修改庫名爲lib_LTLIBRARIES=libname.la
    c)在SourceFiles裏libname_la_SOURCES=fun1.c fun2.c fun3.c
3)在終端執行autoconf之前,首先執行libtoolize -f –c
    //生成製作動態庫必要的文件

十三、安裝rpm二進制安裝包

  1. RPM包管理-rpm命令管理
    安裝語法結構:rpm -ivh 包全名
    升級語法結構:rpm -Uvh 包全名
    卸載語法結構:rpm -evh 包全名
    查詢是否安裝:rpm -qa 包名
    【參數】
    -r //安裝
    -v //顯示詳細信息
    -h //顯示進度
    -e //卸載
    -U //升級
    -q //查詢
    -a //所有
  2. RPM包管理-yum命令管理
    1. yum的命令:
      yum list //查詢所有可用軟件包列表
      yum search 關鍵字 //搜索服務器上所有和關鍵字相關的包
      yum -y install 包名 //安裝軟件包,並自動回答:是
      yum -y update 包名 //升級軟件包
      yum -y remove 包名 //卸載軟件包
    2. yum軟件組管理命令
      yum grouplist //列出所有可用的軟件組列表
      yum groupinstall 軟件組名 //安裝指定軟件組
      yum groupremove 軟件組名 //制裁指定軟件組

十四、 Linux 裏的默認路徑

/etc/   配置文件安裝目錄
/usr/bin/   可執行的命令安裝目錄
/usr/lib/   程序所使用的函數庫保存位置
/usr/share/doc/     基本的軟件使用手冊保存位置
/usr/share/man/     幫助文件保存位置
/usr/local/軟件名/   源碼包安裝位置(自己安裝的軟件)
/bin/   存一般用戶使用的可執行程序
/sbin/  存管理員使用的可執行程序
/boot/  啓動需要的文件
/home/  各用戶的家目錄
/var/log/   存放日誌等信息
/usr/   用戶自行安裝的軟件存放在此
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章