部分內容選自《Linux命令行與shell腳本編程大全.第3版》1 什麼是LinuxLinux可劃分為以下四部分:Linux內核GNU工具圖形化桌面環境應用程式完整的Linux系統如下圖:1.1 Linux內核Linux系統的核心就是內核,內核控制電腦系統上的所有硬體和軟體,在必要時分配硬體,並根... ...
部分內容選自《Linux命令行與shell腳本編程大全.第3版》
1 Linux是什麼
Linux可劃分為以下四部分:
- Linux內核
- GNU工具
- 圖形化桌面環境
- 應用程式
完整的Linux系統如下圖:
Linux內核
Linux系統的核心就是內核,內核控制電腦系統上的所有硬體和軟體,在必要時分配硬體,並根據需要執行軟體。
內核主要負責以下四種功能:
- 系統記憶體管理
- 軟體程式管理
- 硬體設備管理
- 文件系統管理
(1)系統記憶體管理
管理伺服器的可用物理記憶體,以及創建和管理虛擬記憶體;
(2)軟體程式管理
Linux系統將運行中的程式稱為進程,內核控制著Linux系統如何管理運行在系統上的所有進程。
(3)硬體設備管理
任何Linux系統需要與設備通信,都需要在內核代碼中加入其驅動程式代碼。驅動程式代碼相當於應用程式和硬體設備的中間人,允許內核與設備之間交換數據。
Linux系統將硬體設備當成特殊的文件,稱為設備文件。設備文件有3種分類:
- 字元型設備文件:處理數據時每次只能處理一個字元設備;
- 塊設備文件:指的是處理數據時每次能處理大塊數據的設備,通常用b表示,如硬碟,brw-rw----. 1 root disk 8, 0 8月 19 01:50 /dev/sda
- 網路設備文件:網卡、迴環設備;
Linux為系統上的每個設備都創建一種稱為節點的特殊文件,與設備的所有通信都通過設備節點完成,比如網卡文件、硬碟文件;
(4)文件系統管理
系統上支持的文件系統
GNU工具
(1)shell
GNU/Linux shell是一種特殊的互動式工具。shell的核心是命令提示符,命令提示符是shell負責交互的部分。允許你輸入文本命令,然後解釋命令,併在內核中執行。
shell包含一組內部命令,用這些命令可以完成複製文件、移動文件、重命名文件、顯示和終止系統中正在運行的程式等操作。shell也允許你在命令行提示符中輸入程式的名稱,shell會將程式名傳遞給內核以啟動它。
在Linux系統中,通常有好幾種shell可用,不同的shell有不同的特性,所有Linux發行版預設的shell都是bash shell,常見的shell:ash、sh、ksh。
2 什麼是shell
在Linux內核與用戶之間的解釋器程式
— 通常指/bin/bash(預設解釋器)
— 負責向內核翻譯及傳達用戶/程式指令
—相當於操作系統的“外殼”
使用腳本和命令行的優缺點:
互動式 ——命令行
— 人工干預、智能化程度高;
— 逐條解釋執行、效率低;
非互動式 ——腳本
— 需要提前設計、智能化難度大;
— 批量執行、效率高;
— 方便在後臺靜悄悄地運行;
shell就類似於汽車這個概念,那麼bash就比喻為具體的品牌型號,比如寶馬M2、M3。
/etc/shells 這個文件是保存系統中有多少shell可用
如何切換shell呢?
查看/etc/shells文件裡面有多少可用的解釋器,直接輸入解釋器名稱即可,比如在命令行直接輸入ksh就能切換,如果想返回到bash(預設解釋器)直接exit即可。
其他的解釋器並沒有bash好用,所以紅帽官方選擇它當做預設的解釋器!bash有的特性是其他解釋器沒有的!
3 變數
變數是用來存放某種變化的值;
作用:
1、提高腳本對任務需求、運行環境變化的適應能力;
2、方便在腳本中重覆使用;
設置變數:變數名=值
調用變數:$變數名,${變數名}
變數的命名規則:
1、不能使用程式中的保留字,例如:if、for、ls等等;
2、只能使用數字、字母以及下劃線,且不能以數字開頭;
3、設置變數的時候一定要清楚這個變數是幹嘛用的;
bahs中變數種類:
- 環境變數
- 本地變數
- 位置變數
- 特殊變數
環境變數
環境變數對所有的父子shell都是可以使用,變數名通常都是大寫,環境變數是由系統自帶的變數;
設置變數:變數名=值
設置環境變數:export 變數名(註意:變數名不需要加上$)
刪除環境變數:unset 變數名(註意:變數名不需要加上$)
顯示所有環境變數:env、printenv
本地變數
局部變數只對當前shell進程有效;
設置變數:
(1)可以是直接設置:變數名=”值”;
(2)使用命令設置變數:變數名=`命令`,變數名=$(命令),兩種設置方法;
(3)變數引用:變數名=”$變數名”
設置變數:變數名=值
刪除環境變數:unset 變數名(註意:變數名不需要加上$)
查看所有已定義的變數:set
位置變數
位置變數用$1,$2,$3…來表示,用於讓腳本通過命令行傳遞參數給變數;
$1:第一個參數
$2:第二個參數
$3:第三個參數
...
特殊變數
$?:上一條命令的返回狀態,0表示命令成功,非0表示命令失敗;
$0:腳本名稱;
$*:傳遞給腳本的所有參數;
$@:傳遞給腳本的所有參數;
$#:傳遞給腳本參數的個數;
$$:顯示腳本的PID進程號
引號
在調用變數時使用引號可定義變數名的範圍;
" ":把多個內容變成一個整體;
' ':把多個內容變成一個整體,但是單引號屏蔽特殊符號,也就是說在調用變數的使用單引號就無法調用;
$():取命令的結果;
``:取命令的結果;
4 重定向輸入和輸出
輸出重定向:在bash shell中輸入命令,命令結果會顯示在屏幕上,那麼輸入重定向就是將命令的顯示結果輸出到另一個位置中,比如文件;
輸入重定向:與輸入重定向正好相反,輸入重定向是將文件的內容重定向到命令;
輸出重定向可以理解為本來要顯示在屏幕上內容給它放到文件中,那麼輸入重定向就是本來要通過鍵盤輸入內容直接從文件中去讀取,文件的內容代替了鍵盤輸入;
標準輸入,描述號為0;
標準輸出,描述號為1;
標準錯誤,描述號為2;
&:錯誤信息和正確信息
>:覆蓋重定向
>>:追加重定向
# mail -s dacui root < note.txt
5 管道
命令1 | 命令2 | 命令3 | ……
是將前一個命令的輸出結果交由後一個命令處理
6 算術運算
運算符:+ - * / % **
有四種方法做運算:
1、expr 但是只做整數運算,不能運算小數點!
2、使用echo $[a運算符b];
3、let
let計算結果不會顯示出來,必須要給一個變數賦值
let test=1+2
4、bc:系統自帶的計
算器,但是是互動式的;
7 條件測試
條件的方法有兩種,條件測試的種類有三種
方法:(每個參數、符號之間必須要有空格!)
1、test
格式:test a = a
2、[ a = a ]
字元串測試
!:取反
-z:判斷字元串是否為空
==:判斷是否字元串相等
!=:判斷字元串是否不等於
;:A命令 ; B命令 分號後的命令和前邊的沒有任何關係,先執行A然後執行B
數值測試(只能測試整數,不能測試小數!)
-eq:等於 equal
-ne:不等於 not equal
-gt:大於 greater than
-ge:大於等於 great or equal
-lt:小於 less than
-le:小於等於 less or equal
格式: [ 數 符號 數 ]
文件目錄測試
判斷文件/目錄是否存在
!:取反
-e:判斷對象是否存在(不管是目錄還是文件)
-f:判斷對象是否為文件
-d:判斷對象是否為目錄
-r:判斷對象是否可讀
-w:判斷對象是否可寫
-x:判斷對象是否可執行
Bash基本特性
— 快捷鍵、Tab鍵補全
— 命令歷史
— 命令別名
— 標準輸入輸出
— 重定向
— 管道操作
註意:選項不要過度依賴Tab鍵(針對於7),個人認為選項能不用Tab就不要用,命令和文件/目錄路徑可以使用。
命令歷史:預設記錄1000條,通過全局變數HISTSIZE設置;(記錄最好改到100以內,每一條命令操作都會有記錄,所以任何人都可以看到,所以為了安全起見)
所有用戶生效,配置文件:/etc/profile
命令歷史使用:!885或者!cat(最近使用cat的記錄)可以重覆使用之前輸入的命令;
清空命令歷史:history -c(但是在每個用戶的家目錄裡邊還有個文件.bash_history,歷史命令已經保存文件中所以要想徹底清空需要把這個文件刪除!刪除後會自動生成!)
腳本的設計
寫腳本的三個步驟:
1、腳本聲明(需要的解釋器、作者信息等)
2、註釋信息(步驟、思路、用途、變數含義等)
#autor:作者、郵箱
#version:版本
#Description:描述
3、可執行語句(操作代碼)
Linux會按照腳本的上下順序去執行
執行腳本的方式:
1、chmod +x
2、使用絕對路徑來運行
3、bash 運行
4、source 運行
腳本的執行一般都是開啟子進程的,但是如果使用source命令執行腳本是不開啟子進程的;
source 在當前進程執行
例如,目前有一個腳本名稱為a.sh,內容為sleep 100,分別使用bash a.sh ./a.sh /root/a.sh source a.sh執行
使用bash a.sh ./a.sh /root/a.sh這三種執行都是一樣的,開啟子進程
[root@server0 sh]# pstree
bash(當前進程)─── bash(腳本開啟的子進程)─── sleep
使用source a.sh結果:
[root@server0 sh]# pstree
bash(當前進程)─── sleep
那麼開啟子進程和不開啟子進程有什麼區別嗎?
沒有太多意義,但是有的時候會需要!比如,修改/etc/profile文件中的HISTSIZE為20條,配置文件修改不能立即生效,需要在新的終端才生效,此時我不想開新的終端那麼就使用source命令去執行即可;
未來90%多的腳本都是按照正常執行,不需要考慮到開不開子進程,少數需要考慮到,特殊情況;
read
只定義變數名
-p:提示
stty -echo 不在終端顯示輸入信息
stty echo 在終端顯示輸入信息
export將局部變數變成全局變數
if
for
while
9.case
10.函數
11.腳本中斷
12.字元串處理
13.數組
14.互動式腳本