一、什么是 shell?
? ? ? ?狹義的shell指的是指令列方面的軟件,包括基本的linux操作窗口Bash等,廣義的shell則包括 圖形接口的軟件,因為圖形接口其實也可以操作各種驅動程序來呼叫核心進行工作。
? ? ? ?系統合法的 shell 均寫在 /etc/shells 文件中。
二、Bash Shell 的基本操作技巧
1、查看前一次登錄執行過的命令:vim ~/.bash_history
2、命令和文件補全功能(Tab鍵)
tab 接在一串指令的第一個字后面,則為命令補全
tab 接在一串指令的第二個字后面,則為文件補全
3、命令別名設定功能:alias
alias lm=’ls -al’
4、程序化腳本(shell scripts)
5、通配符
?
6、換行輸入 +[enter]
7、從光標向前或者向后刪除字符串 [crtl]+u / [crtl] +k
8、從光標移動到整個指令串的最前面/最后面 [crtl] +a / [crtl]+e
9、使用 env 和 export 可觀察環境變量;set 可以觀察目前 bash 環境下的所有變量
10、連續命令中 ; 可以讓兩個命令連續執行:
-
&& 前一個指令必須沒有錯誤信息
-
|| 如果正確就不執行第二條。錯誤接著執行第二條
?11、編碼問題:LANG 或者 是 LC_ALL設置; locale 列出當前語種。
?12、查看別名的原代碼 : type -a 別名命令
?13、列出所有的按鍵和按鍵內容:stty -a
?14、設定按鍵功能:stty erase ^h ?: 設定crtl + h 向后刪除字符
?15、獲取核心版本:echo $(uname -r)
?
三、Shell Script
? ? ? ? 概念:Shell script 是利用shell 的功能 所寫的一個程序,這個程序是使用純文本文件。將一些 shell 的語法與指令寫在里面,搭配正則表達式、管線命令與數據流重導向等功能,以達到我們的處理命令。
? ? ? ? 個人理解:其實Shell script 就是window 中的批處理命令,它將shell 指令、再加上一點腳本的語法 寫出來的程序。shell script 用在系統管理上面是很好的一項工具,但是用在處理大量數值運算上,就不夠好了,因為shell scripts的速度較慢,且使用的CPU資源較多,造成主機資源的分配不良。
? ? ? ? 變量:
?變量類型:bash變量類型默認為字符串,可以是整型或數組類型,沒有浮點型,所以沒有小數,1/3 結果是0.
?
?變量聲明:默認為字符串,可以 直接聲明為 變量名=變量內容(x=123)這樣,如果要聲明為數組或者整型可以:
-
變量和變量內容以一個等號=連接,a=123
-
等號兩邊不能直接接空格符
-
由英文字母和數字組成,但開頭不能是數字
-
變量內容中如果有特殊字符,可以用””或”將變量內容結合起來
-
” “中 $變量,可以保留原本的特性
-
‘ ‘ 中$變量,當成一般字符來處理
-
可以用跳脫字符 來使不認識的特殊字符來當成一般字符
-
“或者()的意義:“或者()里面的指令先被執行,作為外部的輸入信息
-
將 – 變成 + 可以進行[取消]動作:declare +x sum :
-
單獨列出變量的類型:declare -p sum
-
升級成環境變量:export PATH
-
取消變量 :unset a
-
數組定義:var[1]=”123″ var[2]=”456″ var[3]=”789″
-
“或者()的意義:“或者()里面的指令先被執行,作為外部的輸入信息
-
變量 $$:出現的數字就是你的PID號碼
-
變量 ?:上一個錯誤指令的錯誤代碼,如果沒有錯誤就為0
?
?
變量交互:read -p “請輸入你的名字:” -t 30 name (-p表示提示世界,-t 表示30秒的輸入時間)
?
變量內容的擴展:PATH=”$PATH”:/home/bin
?
變量內容的刪除:echo ${path#/*:}?這句話的意思是從/開始到:之間刪除掉最短的字符
?
變量內容的替換:
?
執行:?
1、直接絕對路徑和相對路徑執行,執行者必須要有腳本的執行權限。
2、全局變量的話 可以通過 bash shell.sh 或 sh shell.sh來執行
?
source、 sh script 的執行方式差異?
? ? sh script 或者 bash script 都會使用一個新的bash環境來執行腳本中的命令,當子程序完成后,子程序完成后,在子程序內的各個變量或者動作將會結束而不會傳回父程序中
? ? source script 會在父程序中執行,因此各項動作都會在原本的bash 內生效
?
流程控制(順序):shell scripts 依照 從上到下、從左到右 的順序執行。
?
流程控制(條件):
-
test -e file 文件名是否存在
-
test -f file 文件名是否存在 且為file
-
test -d directory 文件名是否存在且為目錄
-
test -r -w -x filename 是否具有可讀可寫可執行的權限
-
test n1 -eq n2 兩數值相等
-
test n1 -ne n2 兩數值不等
-
? ? ? ? ? ? -gt ?n1大于n2
-
? ? ? ? ? ? -lt ? n1小于n2
-
? ? ? ? ? ? -ge ?大于等于
-
? ? ? ? ? ? -le ? 小于等于

?
腳本的變量交互還可以用 ${0}、${1}、${2}、${3} 來進行,${0} 表示執行的腳本名、${1} 表示輸入的第一個變量、${2}表示輸入的第二個變量、${3} 表示輸入的第三個變量?

?
if 條件判斷


?
?case 條件判斷

?
流程控制(循環):
while 循環


?
?for 循環


?
for 循環


?
函數:?

? ? ? ? 注意點:和傳統語言不同,函數必須定義在腳本最前面,以便程序執行的時候可以認識函數。函數 形參 也是用${1}、${2}、${3} 來傳參,也就是說函數內的${1}/${2}/${3} 辨認的調函數時傳進去的實參。而不是 執行腳本傳遞時的參數
?
? ? ? ? ? ? ?