【原創(chuàng)博文,轉(zhuǎn)載請注明出處!】
準(zhǔn)備學(xué)習(xí)下Shell命令,俗話說“好記性不如爛筆頭”,做點筆記方便以后查找。詳細(xì)學(xué)習(xí)途徑請移步 --> Shell菜鳥教程
(一) Shell環(huán)境
Shell常識腦補(bǔ)
① Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設(shè)計語言。
② Shell 是指一種應(yīng)用程序,這個應(yīng)用程序提供了一個界面,用戶通過這個界面訪問操作系統(tǒng)內(nèi)核的服務(wù)。
③ Ken Thompson 的 sh 是第一種 Unix Shell,Windows Explorer 是一個典型的圖形界面 Shell。
④ Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。
⑤ 業(yè)界所說的 shell 通常都是指 shell 腳本,但讀者朋友要知道,shell 和 shell script 是兩個不同的概念。
⑥一般 新建一個文件擴(kuò)展名為 sh(sh代表shell),擴(kuò)展名并不影響腳本執(zhí)行,見名知意就好,如果你用 php 寫 shell 腳本,擴(kuò)展名就用 php 好了。
由于習(xí)慣的原因,簡潔起見,本文出現(xiàn)的 "shell編程" 都是指 shell 腳本編程,不是指開發(fā) shell 自身。
創(chuàng)建一個Shell腳本(test.sh)
打開終端 -->cd到腳本要存放的位置 (如:我想在桌面上創(chuàng)建一個Shell文件夾,并在該文件夾里新建一個test.sh的腳本文件)。
使用文本編輯器(Xcode,CS Code等其他編輯器都可以)打開test.sh,并加入如下兩行code:
#!/bin/bash
echo "Hello World !"
"#!" 是一個約定的標(biāo)記,它告訴系統(tǒng)這個腳本需要什么解釋器來執(zhí)行,即使用哪一種 Shell。
"echo" 命令用于向窗口輸出文本。
Shell腳本執(zhí)行方式
1、作為可執(zhí)行程序
將上面的代碼保存為 test.sh,并 cd 到相應(yīng)目錄:
chmod +x ./test.sh #使腳本具有執(zhí)行權(quán)限
./test.sh #執(zhí)行腳本
注意,一定要寫成 ./test.sh,而不是 test.sh,運行其它二進(jìn)制的程序也一樣,直接寫 test.sh,linux 系統(tǒng)會去 PATH 里尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的當(dāng)前目錄通常不在 PATH 里,所以寫成 test.sh 是會找不到命令的,要用 ./test.sh 告訴系統(tǒng)說,就在當(dāng)前目錄找。
2、作為解釋器參數(shù)
這種運行方式是,直接運行解釋器,其參數(shù)就是 shell 腳本的文件名,如:
/bin/sh test.sh
/bin/php test.php
這種方式運行的腳本,不需要在第一行指定解釋器信息,寫了也沒用。
下面我們嘗試用方法1在終端執(zhí)行test.sh腳本,成功運行會輸出“Hello World!”。
將上面的代碼保存好,并在終端 cd 到相應(yīng)目錄(即Shell的位置)

可以看到成功地輸出了“Hello World! ”(當(dāng)然方法2更簡單,不需要指定腳解釋器信息,寫了也沒用)。如果不想這么麻煩,直接看到“Hello World!”,你也可以在終端直接輸入 echo "Hello World"嘛,但是終端畢竟不是我等凡夫俗子能駕馭的
(二) Shell基本語法
A.變量
示例:定義一個變量名name并賦值為Rephontil
name="Rephontil"
需要注意的是:變量名和等號之間不能有空格,這與我們之前熟悉的所有編程語言都不一樣(足以奇葩)。
使用變量,只要在變量名前面加美元符號即可,如:
name="Rephontil"
方式one ---> echo $name
方式two ---> echo ${name}
變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,比如下面這種情況:
studentName="小明"
方式1 ---> echo "那位調(diào)皮的同學(xué)叫${studentName}"
方式2 ---> echo "那位調(diào)皮的同學(xué)叫$studentName"
方式1 成功顯示“那位調(diào)皮的同學(xué)叫小明”
方式2 成功顯示“那位調(diào)皮的同學(xué)叫studentName”。這顯然
總結(jié):Shell編程推薦給所有變量加上花括號,這是個好的編程習(xí)慣。
B.數(shù)組
bash支持一維數(shù)組(不支持多維數(shù)組),并且沒有限定數(shù)組的大小
類似與C語言,數(shù)組元素的下標(biāo)由0開始編號。獲取數(shù)組中的元素要利用下標(biāo),下標(biāo)可以是整數(shù)或算術(shù)表達(dá)式,其值應(yīng)大于或等于0。
定義數(shù)組
在Shell中,用括號來表示數(shù)組,數(shù)組元素用"空格"符號分割開。定義數(shù)組的一般形式為:數(shù)組名=(值1 值2 ... 值n)
如:nameArr=("football" "足球" "籃球" "羽毛球")
讀取數(shù)組
讀取數(shù)組元素值的一般格式是:
{nameArr[0]} -> football
使用@符號可以獲取數(shù)組中的所有元素,例如:
echo ${nameArr[@]} -> football 足球 籃球 羽毛球
獲取數(shù)組的長度
獲取數(shù)組長度的方法與獲取字符串長度的方法相同,例如:
# 取得數(shù)組元素的個數(shù)
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得數(shù)組單個元素的長度
length=${#array_name[n]}
C.注釋
以"#"開頭的行就是注釋,會被解釋器忽略。
sh里沒有多行注釋,只能每一行加一個#號。
如果在開發(fā)過程中,遇到大段的代碼需要臨時注釋起來,過一會兒又取消注釋,怎么辦呢?
每一行加個"#"符號太費力了,可以把這一段要注釋的代碼用一對花括號括起來,定義成一個函數(shù),沒有地方調(diào)用這個函數(shù),這塊代碼就不會執(zhí)行,達(dá)到了和注釋一樣的效果。
D.傳遞參數(shù)
我們可以在執(zhí)行 Shell 腳本時,向腳本傳遞參數(shù),腳本內(nèi)獲取參數(shù)的格式為:$n。n 代表一個數(shù)字,1 為執(zhí)行腳本的第一個參數(shù),2 為執(zhí)行腳本的第二個參數(shù),以此類推……
echo "Shell 傳遞參數(shù)實例!";
echo "執(zhí)行的文件名:$0";
echo "第一個參數(shù)為:$1";
echo "第二個參數(shù)為:$2";
echo "第三個參數(shù)為:$3";
在終端執(zhí)行腳本后log如下(1 2 3為我們傳入的3個參數(shù)):
Rephontil:Shell zhouyong$ /bin/sh test.sh 1 2 3
Shell 傳遞參數(shù)實例!
執(zhí)行的文件名:test.sh
第一個參數(shù)為:1
第二個參數(shù)為:2
第三個參數(shù)為:3
注:其中 $0 為執(zhí)行的文件名。
另外,還有幾個特殊字符用來處理參數(shù),下表所列:

說明:怎么看@ 區(qū)別?
相同點:都是引用所有參數(shù)。
不同點:只有在雙引號中體現(xiàn)出來。假設(shè)在腳本運行時寫了三個參數(shù) 1、2、3,,則 " * " 等價于 "1 2 3"(傳遞了一個參數(shù)),而 "@" 等價于 "1" "2" "3"(傳遞了三個參數(shù))。
# ① $*
for i in "$*"; do
echo $I
done
# ② $@
for i in "$@"; do
echo $I
done
①結(jié)果為: 1 2 3
②結(jié)果為:
1
2
3
明顯看出:①結(jié)果為一個整體 ②結(jié)果保持傳進(jìn)去的獨立個體
E.Shell 基本運算符
Shell 和其他編程語言一樣,支持多種運算符,包括:
算數(shù)運算符
關(guān)系運算符
布爾運算符
字符串運算符
文件測試運算符
原生bash不支持簡單的數(shù)學(xué)運算,但是可以通過其他命令來實現(xiàn),例如 awk 和 expr,expr 最常用。
expr 是一款表達(dá)式計算工具,使用它能完成表達(dá)式的求值操作。
例如,兩個數(shù)相加(注意使用的是反引號 ` 而不是單引號 '):
注意要點:
a.表達(dá)式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數(shù)編程語言不一樣。
b.完整的表達(dá)式要被 ` ` 包含,注意這個字符不是常用的單引號,在 Esc 鍵下邊。

注意:條件表達(dá)式要放在方括號之間,并且要有空格,例如: [
b] 是錯誤的,必須寫成 [
b ]。
關(guān)系運算符




