平常的linux系統管理工做中必不可少的就是shell腳本,若是不會寫shell腳本,那麼
你就不算一個合格的管理員。目前不少單位在招聘linux系統管理員時,shell腳本的編寫是
必考的項目。有的單位甚至用shell腳本的編寫能力來衡量這個linux系統管理員的經驗是否
豐富。筆者講這些的目的只有一個,那就是讓你認真對待shell腳本,從一開始就要把基礎
知識掌握牢固,而後要不斷的練習,只要你shell腳本寫的好,相信你的linux求職路就會輕
鬆的多。筆者在這一章中並不會多麼詳細的介紹shell腳本,而只是帶你進入shell腳本的世
界,若是你很感興趣那麼請到網上下載相關的資料或者到書店購買相關書籍吧。
在學習shell 腳本以前,須要你瞭解不少關於shell的知識,這些知識是編寫shell腳本
的基礎,因此但願你可以熟練的掌握。linux
【什麼是shell】
簡單點理解,就是系統跟計算機硬件交互時使用的中間介質,它只是系統的一個工具。
實際上,在shell和計算機硬件之間還有一層東西那就是系統內核了。打個比方,若是把計
算機硬件比做一我的的軀體,而系統內核則是人的大腦,至於shell,把它比做人的五官似
乎更加貼切些。回到計算機上來,用戶直接面對的不是計算機硬件而是shell,用戶把指令
告訴shell,而後shell再傳輸給系統內核,接着內核再去支配計算機硬件去執行各類操做。
筆者接觸的linux發佈版本(Redhat/CentOS)系統默認安裝的shell叫作bash,即Bourne
AgainShell,它是sh(BourneShell)的加強版本。BournShell 是最先行起來的一個shell,創
始人叫StevenBourne,爲了記念他因此叫作BournShell,檢稱sh。那麼這個bash有什麼特
點呢?
1)記錄命令歷史
咱們敲過的命令,linux是會有記錄的,預設能夠記錄1000條歷史命令。這些命令保存
在用戶的家目錄中的.bash_history文件中。有一點須要你知道的是,只有當用戶正常退出當
前shell時,在當前shell中運行的命令纔會保存至.bash_history文件中。
與命令歷史有關的有一個有意思的字符那就是」!」了。經常使用的有這麼幾個應用:(1)!!(連
續兩個」!」),表示執行上一條指令;(2)!n(這裏的n是數字),表示執行命令歷史中第n
條指令,例如」!100」表示執行命令歷史中第100個命令;(3)!字符串(字符串大於等於1),
例如!ta,表示執行命令歷史中最近一次以ta爲開頭的指令。正則表達式
2)指令和文件名補全
在本教程最開始筆者就介紹過這個功能了,記得嗎?對了就是按tab鍵,它能夠幫你補
全一個指令,也能夠幫你補全一個路徑或者一個文件名。連續按兩次tab鍵,系統則會把所
有的指令或者文件名都列出來。shell
3)別名
前面也出現過alias的介紹,這個就是bash所特有的功能之一了。咱們能夠經過aliasvim
把一個經常使用的而且很長的指令別名一個簡潔易記的指令。若是不想用了,還能夠用unalias
解除別名功能。直接敲alias會看到目前系統預設的alias:bash
看到了吧,系統預設的alias指令也就這幾個而已,你也能夠自定義你想要的指令別名。alias
語法很簡單,alias [命令別名]=[’具體的命令’]。
4)通配符
在bash下,可使用*來匹配零個或多個字符,而用?匹配一個字符。less
5)輸入輸出從定向
輸入重定向用於改變命令的輸入,輸出重定向用於改變命令的輸出。輸出重定向更爲常
用,它常常用於將命令的結果輸入到文件中,而不是屏幕上。輸入重定向的命令是<,輸出
重定向的命令是>,另外還有錯誤重定向2>,以及追加劇定向>>,稍後會詳細介紹。工具
6)管道符
前面已經提過過管道符」|」,就是把前面的命令運行的結果丟給後面的命令。學習
7)做業控制。
當運行一個進程時,你可使它暫停(按Ctrl+z),而後使用fg命令恢復它,利用bg命
令使他到後臺運行,你也可使它終止(按Ctrl+c)。
【變量】
前面章節中筆者曾經介紹過環境變量PATH,這個環境變量就是shell預設的一個變量,
一般shell預設的變量都是大寫的。變量,說簡單點就是使用一個較簡單的字符串來替代某
些具備特殊意義的設定以及數據。就拿PATH來說,這個PATH就代替了全部經常使用命令的絕
對路徑的設定。由於有了PATH這個變量,因此咱們運行某個命令時再也不去輸入全局路徑,
直接敲命令名便可。你可使用echo命令顯示變量的值。.net
除了PATH,HOME,LOGNAME外,系統預設的環境變量還有哪些呢?教程
使用env命令便可所有列出系統預設的所有系統變量了。不過登陸的用戶不同這些環境變
量的值也不同。當前顯示的就是root這個帳戶的環境變量了。下面筆者簡單介紹一下常
見的環境變量:
PATH 決定了shell將到哪些目錄中尋找命令或程序
HOME 當前用戶主目錄
HISTSIZE歷史記錄數
LOGNAME 當前用戶的登陸名
HOSTNAME 指主機的名稱
SHELL 前用戶Shell類型
LANG 語言相關的環境變量,多語言能夠修改此環境變量
MAIL 當前用戶的郵件存放目錄
PWD 當前目錄
env命令顯示的變量只是環境變量,系統預設的變量其實還有不少,你可使用set命
令把系統預設的所有變量都顯示出來。
限於篇幅,筆者在上例中並無把全部顯示結果都截圖。set不只能夠顯示系統預設的變量,
也能夠連同用戶自定義的變量顯示出來。用戶自定義變量?是的,用戶本身一樣能夠定義變
量。
雖然你能夠自定義變量,可是該變量只能在當前shell中生效,不信你再登陸一個shell試試?
使用bash命令便可再打開一個shell,此時先前設置的myname變量已經不存在了,退出當
前shell回到原來的shell,myname變量還在。那要想設置的變量一直生效怎麼辦?有兩種
狀況:
1)要想系統內全部用戶登陸後都能使用該變量
須要在/etc/profile文件最末行加入「export myname=Aming」 而後運行」source
/etc/profile」就能夠生效了。此時你再運行bash命令或者直接su-test帳戶看看。
#vim /etc/profile 用vim打開profile文件
#G //移動到尾部
#o //在下面新添加一行
#export myname=Aming
esc
#:wq
2)只想讓當前用戶使用該變量
須要在用戶主目錄下的.bashrc文件最後一行加入「export myname=Aming」 而後運
行」source.bashrc」就能夠生效了。這時候再登陸test帳戶,myname變量則不會生效了。上
面用的source命令的做用是,講目前設定的配置刷新,即不用註銷再登陸也能生效。
筆者在上例中使用」myname=Aming」來設置變量myname,那麼在linux下設置自定義變
量有哪些規則呢?
a.設定變量的格式爲」a=b」,其中a爲變量名,b爲變量的內容,等號兩邊不能有空格;
b.變量名只能由英、數字以及下劃線組成,並且不能以數字開頭;
c. 當變量內容帶有特殊字符(如空格)時,須要加上單引號;
有一種狀況,須要你注意,就是變量內容中自己帶有單引號,這就須要用到雙引號了
d.若是變量內容中須要用到其餘命令運行結果則可使用反引號;
e.變量內容能夠累加其餘變量的內容,須要加雙引號;
在這裏若是你不當心把雙引號加錯爲單引號,將得不到你想要的結果
經過上面幾個例子也許你能看得出,單引號和雙引號的區別:用雙引號時不會取消掉裏面出
現的特殊字符的自己做用(這裏的$),而使用單引號則裏面的特殊字符所有失去它自己的做
用。
在前面的例子中筆者屢次使用了bash命令,若是在當前shell中運行bash指令後,則
會進入一個新的shell,這個shell就是原來shell的子shell了,不妨你用pstree指令來查看
一下。
pstree這個指令會把linux系統中全部進程經過樹形結構打印出來。限於篇幅筆者沒有所有
列出,你能夠直接輸入pstree查看便可。在父shell中設定一個變量後,進入子shell後該變
量是不會生效的,若是想讓這個變量在子shell中生效則要用到export指令,筆者曾經在前
面用過。
export其實就是聲明一下這個變量的意思,讓該shell的子shell也知道變量abc的值是123.
若是export後面不加任何變量名,則它會聲明全部的變量
在最後面連同咱們自定義的變量都被聲明瞭。
前面光講如何設置變量,若是想取消某個變量怎麼辦?只要輸入」unset 變量名」便可。
【系統環境變量與我的環境變量的配置文件】
上面講了不少系統的變量,那麼在linux系統中,這些變量被存到了哪裏呢,爲何用
戶一登錄shell就自動有了這些變量呢?
/etc/profile :這個文件預設了幾個重要的變量,例如PATH,USER,LOGNAME,MAIL,
INPUTRC,HOSTNAME,HISTSIZE,umas等等。
/etc/bashrc :這個文件主要預設umask以及PS1。這個PS1就是咱們在敲命令時,前
面那串字符了,例如筆者的linux 系統PS1就是[root@localhost~]#,你不妨看一下PS1
的值。
\u就是用戶,\h 主機名,\W 則是當前目錄,\$就是那個’#’了,若是是普通用戶則顯示爲’$’
除了兩個系統級別的配置文件外,每一個用戶的主目錄下還有幾個這樣的隱藏文件:
.bash_profile :定義了用戶的我的化路徑與環境變量的文件名稱。每一個用戶均可使用該文件
輸入專用於本身使用的shell信息,當用戶登陸時,該文件僅僅執行一次。
.bashrc :該文件包含專用於你的shell的bash信息,當登陸時以及每次打開新的shell時,該
該文件被讀取。例如你能夠將用戶自定義的alias或者自定義變量寫到這個文件中。
.bash_history :記錄命令歷史用的。
.bash_logout :當退出shell時,會執行該文件。能夠把一些清理的工做放到這個文件中。
【linux shell中的特殊符號】
你在學習linux的過程當中,也許你已經接觸過某個特殊符號,例如」*」,它是一個通配符
號,表明零個或多個字符或數字。下面筆者就說一說經常使用到的特殊字符。
1. * :表明零個或多個字符或數字。
test後面能夠沒有任何字符,也能夠有多個字符,總之有或沒有都能匹配出來。
2. ? :只表明一個任意的字符
不論是數字仍是字母,只要是一個都能匹配出來。
3. # :這個符號在linux中表示註釋說明的意思,即」#」後面的內容linux忽略掉。
在命令的開頭或者中間插入」#」 ,linux都會忽略掉的。這個符號在shell腳本中用的不少。
4. \ :脫意字符,將後面的特殊符號(例如」*」 )還原爲普通字符。
5. | :管道符,前面屢次說過,它的做用在於將符號前面命令的結果丟給符號後面的命
令。這裏提到的後面的命令,並非全部的命令均可以的,通常針對文檔操做的命令比較常
用,例如cat,less, head,tail,grep,cut,sort,wc,uniq,tee,tr,split,sed,awk等等,其中grep,sed,
awk爲正則表達式必須掌握的工具,在後續內容中詳細介紹。
6. $:除了用於變量前面的標識符外,還有一個妙用,就是和’!’結合起來使用。
‘!$’表示上條命中中最後一個變量(也許稱爲變量不合適,總之就是上條命令中最後出現的
那個東西)例如上邊命令最後是test.txt那麼在當前命令下輸入!$則表明test.txt。
1)grep:過濾一個或多個字符,將會在後續內容中詳細介紹其用法。
2) 2)cut :截取某一個字段
語法:cut -d 「分隔字符」 [-cf]n 這裏的n是數字
-d :後面跟分隔字符,分隔字符要用雙引號括起來
-c :後面接的是第幾個字符
-f :後面接的是第幾個區塊
-d 後面跟分隔字符,這裏使用冒號做爲分割字符,-f1就是截取第一段,-f和1之間的空格
無關緊要。
-c 後面能夠是1個數字n,也能夠是一個區間n1-n2,還能夠是多個數字n1,n2,n3