一、什麼是 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
1、概念
Shell script 是利用shell 的功能 所寫的一個程式,這個程式是使用純文字檔案。将一些 shell 的文法與指令寫在裡面,搭配正規表達式、管線指令與資料流重導向等功能,以達到我們的處理指令。其實Shell script 就是window 中的批處理指令,它将shell 指令、再加上一點腳本的文法 寫出來的程式。shell script 用在系統管理上面是很好的一項工具,但是用在處理大量數值運算上,就不夠好了,因為shell scripts的速度較慢,且使用的CPU資源較多,造成主機資源的配置設定不良。
2、變量:
變量類型: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"
- 引用數組 echo ${var[1]}
- 變量 $:出現的數字就是你的PID号碼
- 變量 ?:上一個錯誤指令的錯誤代碼,如果沒有錯誤就為0
變量互動:read -p "請輸入你的名字:" -t 30 name (-p表示提示世界,-t 表示30秒的輸入時間)
變量内容的擴充:PATH="$PATH":/home/bin
變量内容的删除:echo ${path#/*:} 這句話的意思是從/開始到:之間删除掉最短的字元
變量内容的替換:
3、執行
- 直接絕對路徑和相對路徑執行,執行者必須要有腳本的執行權限。
- 全局變量的話 可以通過 bash shell.sh 或 sh shell.sh來執行
source、 sh script 的執行方式差異?
sh script 或者 bash script 都會使用一個新的bash環境來執行腳本中的指令,當子程式完成後,子程式完成後,在子程式内的各個變量或者動作将會結束而不會傳回父程式中
source script 會在父程式中執行,是以各項動作都會在原本的bash 内生效
4、流程控制(順序)
shell scripts 依照 從上到下、從左到右 的順序執行。
5、流程控制(條件)
- 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} 表示輸入的第三個變量
5.1 if 條件判斷
5.2 case 條件判斷
6、流程控制(循環)
6.1 while 循環
6.2 for 循環
7、函數
tips:和傳統語言不同,函數必須定義在腳本最前面,以便程式執行的時候可以認識函數。函數 形參 也是用${1}、${2}、${3} 來傳參,也就是說函數内的${1}/${2}/${3} 辨認的調函數時傳進去的實參。而不是 執行腳本傳遞時的參數。