Shell基礎知識
shell命令語言解釋器,執行命令從標準輸入讀取或從一個文件中讀取。通過用戶輸入命令,和內核進行溝通!簡單點理解就是:用戶直接面對的不是計算機硬件而是shell,用戶把指令告訴shell,然後shell再傳輸給系統內核,接著內核再去支配計算機硬件去執行各種操作。
shell只是系統的一個工具,是系統跟計算機硬件交互時使用的中間介質。實際上,在shell和計算機硬件之間還有一層東西那就是系統內核了。
shell有bash、zsh、ksh等;而centos7默認使用的是Bourne agin shell,也就是bash。
命令歷史:
我們敲過的命令,linux是會有記錄的,預設可以記錄1000條歷史命令。這些命令保存在用戶的家目錄中的.bash_history文件中。有一點需要你知道的是,只有當用戶正常退出當前shell時,在當前shell中運行的命令才會保存至.bash_history文件中。
如果你要修改記錄的最大值,需要在/etc/profile文件中修改變量HISTSIZE;如果你還想記錄輸入命令的時間,可以在/etc/profile文件添加HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "。當然如果你想永久保存所有的命令歷史:chattr +a ~/.bash_history
與命令歷史有關的特殊字符"!":
!! 表示執行上一個指令;
!n 這裏的n是數字,表示執行命令歷史中第n條指令,例如 !1002 表示執行命令歷史中第1002個命令;
!word (word大於等於1),例如 !pw 表示執行命令歷史中最近一次以 ‘pw’ 為開頭的指令。
命令補全和別名:
命令補全:使用tab鍵;按一下tab鍵是補全命令或路徑,按兩下tab鍵是列出所有匹配的命令。若想參數補全的話,需要yum安裝bash_completion
alias別名:alias [命令別名]=['具體的命令'];這樣可以通過alias把一個常用的並且很長的指令別名一個簡潔易記的指令。解除別名命令:unalias [命令別名]。
註意:每個用戶都有自己的配置別名文件:~/.bashrc,所以用戶自定義的alias應該放在此文件;系統內置的別名一般在/etc/profile.d/目錄下。
通配符:
在bash下,可以使用 * 來匹配零個或多個字符,而用 ? 匹配一個字符。還有[0-9]匹配個位數字,{1,2}匹配1和2 等等的使用
輸入輸出重定向:
輸入重定向:< 追加輸入重定向:<<
輸出重定向:> 追加輸出重定向:>>
錯誤輸出重定向:2> 錯誤追加重定向:2>>
&> 等於 2>&1
管道符和作業控制:
管道符 “|”, 就是把前面的命令運行的結果丟給後面的命令
作業控制:
Ctrl+c 終止任務
Ctrl+z 暫停任務
jobs 可以看到在被暫停或者在後臺運行的任務
bg [id] 暫停的任務丟在後臺跑起來
fg [id] 把任務調到前臺
& 在命令後面加上& 表示直接把任務放到後臺執行,它會顯示pid信息。
kill pid殺死進程;如果遇到殺不死的進程時,可以在kill 後面加一個選項: kill -9 [pid](需謹慎)
shell變量:
之前介紹過環境變量PATH,這個環境變量就是shell預設的一個變量,通常shell預設的變量都是大寫的。還有HOME、PWD、LOGNAME等等。可以輸入命令env查看系統預設的全部系統環境變量,你還可以使用set命令把系統預設的全部變量都顯示出來。set不僅可以顯示系統預設的變量,也可以連同用戶自定義的變量顯示出來。
要想系統內所有用戶登錄後都能使用自定義的變量,則修改在配置文件/etc/profile追加,如export mymsql=/usr/local/mysql;修改完配置文件後記得source /etc/profile讓配置文件生效噢。
如果只想讓當前用戶使用該變量,則在用戶主目錄下的 .bashrc 文件最後一行加入export mysql=/usr/local/mysql 然後運行 source .bashrc 就可以生效了
設置全局變量使用export命令,取消某個變量:unset [變量名]
環境變量配置文件:
幾個環境變量配置文件:/etc/profile、/etc/bashrc、~/.bashrc、~/.bash_profile、~/.bash_history、~/.bash_logout
/etc/profile:這個文件預設了幾個重要的系統全局變量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE等等
/etc/bashrc:這個文件主要預設umask以及PS1。這個PS1就是我們在敲命令時,前面那串字符:[root@centos7-1 ~]#
~/.bashrc:包含專用於你的shell的bash信息,當登錄時以及每次打開新的shell時,該該文件被讀取。例如你可以將用戶自定義的alias或者自定義變量寫到這個文件中。
~/.bash_profile:定義了用戶的個人化路徑與環境變量的文件名稱。每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次。
~/.bash_history:記錄命令歷史用的。
~/.bash_logout:當退出shell時,會執行該文件。可以把一些清理的工作放到這個文件中。
【當用戶執行shell文件時,讀取配置文件的順序為:/etc/profile.d/* --> /etc/profile --> /etc/bashrc --> ~/.bashrc --> ~/.bash_profile --> ~/.bash_logout 】
shell特殊字符:
* 代表零個或多個任意字符
? 只代表一個任意的字符
# 表示註釋說明的意思
\ 脫衣字符
| 管道符,它的作用是將符號前面命令的結果丟給符號後面的命令
還有下面這些:
$ 變量前綴,!$組合,正則裏面表示行尾
; 多條命令寫到一行,用分號分割
~ 用戶家目錄,後面正則表達式表示匹配符
& 放到命令後面,會把命令丟到後臺
> >> 2> 2>> &> 前面提及的輸出重定向
[] 指定字符中的一個,[0-9],[a-zA-Z],[abc]
||和&& 用於命令之間作為分隔符;|| 表示或者, && 表示並且
(1)command1 ; command2 不管command1是否執行成功都會執行command2
(2)command1 && command2 只有command1執行成功後,command2才會執行,否則command2不執行
(3)command1 || command2 command1執行成功後command2 不執行,否則去執行command2,總之command1和command2總有一條命令會執行
幾個和管道有關的命令:cut、sort、wc、uniq、tee、tr、split
cut:用來截取某一個字段
格式:cut -d '分隔字符' [-cf] n ;這裏的n是數字
-d:後面跟分隔字符,分隔字符要用單引號括起來
-c :後面接的是第幾個字符
-f :後面接的是第幾個區塊
示例:
sort:用於排序
格式:sort [-t 分隔符] [-kn1,n2] [-nru] 這裏的n1 < n2
-t 分隔符 :作用跟cut的-d一個意思
-n :使用純數字排序
-r :反向排序
-u :去重復
-kn1,n2 :由n1區間排序到n2區間,可以只寫-kn1,即對n1字段排序
示例:
wc:用於統計文檔的行數、字符數、詞數
常用選項有:
-l :統計行數
-m :統計字符數
-w :統計詞數
示例:wc不跟任何選項,直接跟文檔,則會把行數、詞數、字符數依次輸出
uniq:去重復的行
常用的選項只有一個:
-c :統計重復的行數,並把行數寫在前面
【使用uniq 的前提是需要先給文件排序,否則不管用。所以經常與sort命令一起使用】
示例:
tee:後跟文件名,類似與重定向 “>”, 但是比重定向多了一個功能,在把文件寫入後面所跟的文件中的同時,還顯示在屏幕上。
示例:
tr:替換字符,常用來處理文檔中出現的特殊符號
常用的選項:
-d :刪除某個字符,-d 後面跟要刪除的字符
-s :把重復的字符去掉
示例:最常用的就是把小寫變大寫: tr ‘[a-z]’ ‘[A-Z]’
split:切割文檔
常用選項:
-b :依據大小來分割文檔,單位為byte
-l :依據行數來分割文檔
示例:如果split不指定目標文件名,則會以xaa xab... 這樣的文件名來存取切割後的文件。當然我們也可以指定目標文件名123開頭
Shell基礎知識