1. 程式人生 > >Shell基礎知識

Shell基礎知識

linux shell

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基礎知識