http://c.biancheng.net/cpp/shell/
Shell是什麼。 是一個命令列解譯器,它為使用者提供了一個向Linux核心發送請求以便運行程式的介面系統級程式,使用者可以用Shell來啟動,掛起,停止甚至是編寫一些程式 還是一個功能強大的變成語言,易編寫,易調試,靈活性較強。Shell是解釋執行的指令碼語言,在Shell中可以直接調用Linux系統命令 Shell的分類 Bourne Shell,也稱為B Shell,1979年起Unix就開始使用它,主檔案名為sh C Shell,主要是BSD版的Unix系統中使用,因其文法和C語言相類似而得名
Shell的兩種主要文法類型有Bourne和C,這兩種文法彼此不相容。前者主要包括sh, ksh, Bash, psh,後者主要包括csh, tcsh。
Linux的標準Shell是Bash。Bash和sh是相互相容的。通過執行echo $SHELL就可以看到當前系統支援的哪種Shell Linux支援的shell
vi /etc/shells 可以看到當前Linux支援的所有Shell
sh 就從Bash進入到了sh
exit 退出當前Shell
使用bash命令可以在已有的Bash下建立一個子Shell,同樣使用exit退出,調用和退出都是一級一級連貫的
後續課程會講自己當前所處的shell是什麼 查看與設定別名
alias 查看系統中所有的命令別名
alias 別名='原命令' 設定命令的別名
如alias rm='rm -i'或者alias ll='ls -l'
相當於設定快捷命令,只不過是臨時生效的 別名永久生效與刪除別名
vi ~/.bashrc 寫入環境變數設定檔
unalias 臨時刪除別名 命令生效順序
常用快速鍵
快速鍵 |
含義 |
ctrl+c |
強制終止當前命令 |
ctrl+l |
清屏 |
ctrl+a |
游標移動到命令列首 |
ctrl+e |
游標移動到命令列尾 |
ctrl+u |
游標所在位置刪除到行首 |
ctrl+z |
把命令放入後台 |
ctrl+r |
在曆史命令中搜尋 |
曆史命令
history 【選項】【曆史命令儲存檔案】
選項:
-c 清空曆史命令
-w 把緩衝中的曆史命令寫入曆史命令儲存檔案~/.bash_history
曆史命令預設會儲存1000條,可以在環境變數設定檔/etc/profile中進行修改HISTSIZE=1000 曆史命令的調用 使用上下箭頭調用以前的曆史命令 使用!n重複執行第n條命令 使用!!重複執行上一條命令 使用!字串重複執行最後一條以該字串開頭的命令 命令與檔案補全
在Bash中,命令與檔案補全是非常方便與常用的功能我們只要在輸入命令或檔案時,按Tab鍵就會自動進行補全 輸出重新導向 標準輸入輸出
裝置 |
裝置檔案名稱 |
檔案描述符 |
類型 |
鍵盤 |
/dev/stdin |
0 |
標準輸入 |
顯示器 |
/dev/stdout |
1 |
標準輸出 |
顯示器 |
/dev/stdeer |
2 |
標準錯誤輸出 |
輸出重新導向
如ipconfig > ~/desktop/test.log,將內容儲存在記錄檔中
只要命令有輸出就能重新導向到檔案中
特別注意,錯誤輸出大於符號和檔案之間不能有空格。。。 正確和錯誤輸出同時儲存
3和4作用是一樣的。推薦3,4,5。
特別這個檔案/dev/null,被稱為『黑洞』,如果把命令重新導向到這兒,系統就直接拋棄了 輸入重新導向
wc【選項】【檔案名稱】
選項:
-c 統計位元組數
-w 統計單詞數
-l 統計行數
這裡首先引入這個例子——wc < test.log,wc命令原本的輸入是鍵盤,現在重新定向為檔案,當然,其實不需要<
另外一個例子是——wc << ddy,它會要求你不斷輸入,知道再遇到ddy,就會停止並做相關統計,實際工作中基本不會用到 多命令順序執行
多命令執行符 |
格式 |
作用 |
; |
命令1 ; 命令2 |
多個命令順序執行,命令之間沒有任何邏輯聯絡 |
&& |
命令1 && 命令2 |
邏輯與,命令1正確執行才會執行命令2,命令1不正確執行,則命令2不會執行 |
shift+\shift+\ |
命令1 shift+\shift+\ 命令2 |
邏輯或,當命令1執行不正確,則命令2才會執行,當命令1正確執行,則命令2不會執行 |
*其中,shift+\意味著|
例如:date ; tar -zcvf etc.tar.gz /etc ; date可以計算中間打包壓縮命令執行的耗時
再如,ls && echo yes || echo no,第一個命令正確執行,輸出yes,錯誤執行,輸出no 管道符
命令格式:命令1 | 命令2,有一定的編程思想在裡面 命令1的正確輸出作為命令2的操作對象,和邏輯與不一樣
例子: ls -l /etc | more代表將ls -l /etc的輸出分屏顯示 netstat -an | grep ESTABLISHED代表搜尋netstat -an輸出中帶有ESTABLISHED的行
如果再變成netstat -an | grep ESTABLISHED | wc -l,此為多管道符命令,代表到最後統計帶有ESTABLISHED的行的數目,即可看出伺服器上串連了多少人 如果原本使用cat輸出的內容中有很多重複,可在後面加上|uniq去重 萬用字元
萬用字元 |
作用 |
? |
匹配一個任一字元 |
* |
匹配0個或任意多個任一字元,也就是可以匹配任何內容 |
[] |
匹配中括弧中任意一個字元。例如[abc]代表一定匹配一個字元,或者a或者b或者c |
[-] |
匹配中括弧中任意一個字元,-代表一個範圍。例如,[a-z]代表匹配一個小寫字母 |
[^] |
邏輯非,表示匹配不是中括弧內的一個字元。例如[^0-9]代表匹配一個不是數位字元 |
Bash中其他特殊符號
符號 |
作用 |
'' |
單引號。在單引號中所有的特殊符號,如"$"和"`"(反引號)都沒有特殊含義 |
"" |
雙引號。在雙引號中特殊符號都沒有特殊含義,但是"$"、"`"和"\"是例外,擁有"調用變數的值"、"引用命令"和"轉義符"的特殊含義 |
`` |
反引號。反引號括起來的內容是系統命令,在Bash中會先執行它。和$()作用一樣,不過推薦使用$(),因為反引號非常容易看錯。 |
$() |
和反引號一樣,用來引用系統命令 |
# |
在Shell指令碼中,#開頭的行代表注釋 |
$ |
用於調用變數的值,如需要調用變數name的值時,需要用$name的方式得到變數的值。 |
\ |
轉義符,跟在\之後的特殊符號將失去特殊含義,變味一般字元。如\$將輸出"$"符號,而不當作是變數引用 |
shell例子見/shell/shell.example
shell指令碼就可以當做命令使用