shell腳本基礎知識-什麼是shell、環境變量

日常的linux系統管理工作中必不可少的就是shell腳本,對於測試工程師來說,掌握shell腳本的編寫能力也是給自己加分的重要技能。

一、什麼是shell

        shell是你(用戶)和Linux(或者更準確的說,是你和Linux內核)之間的接口程序。你在提示符下輸入的每個命令都由shell先解釋然後傳給Linux內核。 說到底,Shell是用戶與內核進行交互操作的一種接口,目前最流行的Shell稱爲bash Shell。

       Shell是解釋執行的腳本語言,所謂腳本語言就是不用編譯就可以直接執行的語言。在Shell中可以調用Linux系統命令。    

       bash,即Bourne Again Shell,它是sh(Bourne Shell)的增強版本。Bourn Shell 是最早行起來的一個shell,創始人叫Steven Bourne,爲了紀念他所以叫做Bourn Shell,檢稱sh。

bash的特點:

1)記錄命令歷史

我們敲過的命令,linux是會有記錄的,預設可以記錄1000條歷史命令。這些命令保存在用戶的家目錄中的.bash_history文件中。注意,只有當用戶正常退出當前shell時,在當前shell中運行的命令纔會保存至.bash_history文件中。

與命令歷史有關的有一個有意思的字符那就是」!」了。常用的有這麼幾個用法:(1)!! (連續兩個」!」),表示執行上一條指令;(2)!n(這裏的n是數字),表示執行命令歷史中第n條指令,例如」!10」表示執行命令歷史中第10個命令;(3)!字符串(字符串大於等於1),例如!ls,表示執行命令歷史中最近一次以ls爲開頭的指令。

2)指令和文件名補全

按tab鍵,它可以補全一個指令,也可以補全一個路徑或者一個文件名。連續按兩次tab鍵,系統則會把所有的指令或者文件名都列出來。補全路徑時,如果該路徑下只有一個文件or目錄,直接點tab鍵就能補全,如果有多個的話需要輸入能區分文件or目錄的開頭。如目錄下有autotest 和test文件夾,我們要進入test,則直接輸入t然後按tab鍵即可補全test。

3)別名

alias是bash所特有的功能之一,通過alias把一個常用的並且很長的指令別名一個簡潔易記的指令。如果不想用了,還可以用unalias解除別名功能。直接敲alias會看到目前系統預設的alias :

以上是系統預設的alias指令,你也可以自定義你想要的指令別名。alias語法很簡單,alias [命令別名]=[’具體的命令’]。

以下爲給vim加別名和解除別名的截圖

4)通配符

在bash下,可以使用*來匹配零個或多個字符,而用?匹配一個字符。

5)輸入輸出重定向

輸入重定向用於改變命令的輸入,輸出重定向用於改變命令的輸出。輸出重定向更爲常用,它經常用於將命令的結果輸入到文件中,而不是屏幕上。

輸入重定向的命令是<,輸出重定向的命令是>,另外還有錯誤重定向2>,以及追加重定向>>,稍後會詳細介紹。

以下爲輸出重定向的舉例,見截圖

6)管道符

管道符」|」,就是把前面的命令運行的結果丟給後面的命令。

7)作業控制

當運行一個進程時,你可以使它暫停(按Ctrl+z),恢復(按fg),後臺運行(按bg),終止(按Ctrl+c)。

 

二、環境變量【PATH】

環境變量就是shell預設的一個變量,通常shell預設的變量都是大寫的。變量,說簡單點就是使用一個較簡單的字符串來替代某些具有特殊意義的設定以及數據。就拿PATH來講,這個PATH就代替了所有常用命令的絕對路徑的設定。因爲有了PATH這個變量,所以我們運行某個命令時不再去輸入全局路徑,直接敲命令名即可。你可以使用echo命令顯示變量的值,見下圖。

另外,使用env命令可全部列出系統預設的全部系統變量。不過登錄的用戶不一樣這些環境變量的值也不一樣。下圖顯示的是我的賬戶的環境變量。

以下爲常見的環境變量:

PATH 決定了shell將到哪些目錄中尋找命令或程序

HOME 當前用戶主目錄

HISTSIZE 歷史記錄數

LOGNAME 當前用戶的登錄名

HOSTNAME 指主機的名稱

SHELL 前用戶Shell類型

LANG 語言相關的環境變量,多語言可以修改此環境變量

MAIL 當前用戶的郵件存放目錄

PWD 當前目錄

env命令顯示的變量只是環境變量,系統預設的變量其實還有很多,你可以使用set命令把系統預設的全部變量都顯示出來。這裏不單獨截圖了,有興趣的話可以自己試一下。

set不僅可以顯示系統預設的變量,也可以連同用戶自定義的變量顯示出來。如下圖,用戶可以自定義變量。

自定義變量只能在當前shell中生效,見下圖,使用bash命令再打開一個新的shell,再次打印之前設置的test變量,發現已經不存在然後再操作退出新的shell回到原來的shell,test變量還在。

但是我們也能設置變量一直生效,包括兩種情況:

1、變量供所有用戶使用

需要在/etc/profile文件最末行加入 「export test=autotest」 然後運行」source /etc/profile」就可以生效了。此時你再運行bash命令或者切換賬戶看看。

2、變量僅供當前用戶使用

需要在用戶主目錄下的.bashrc文件最後一行加入「export test=autotest」 然後運行」source .bashrc」就可以生效了。這時候再登錄另一個賬戶,test變量則不會生效了。

注意:linux下設置自定義變量也有一些規則:

1)設定變量的格式爲」a=b」,其中a爲變量名,b爲變量的內容,等號兩邊不能有空格;

2)變量名只能由英、數字以及下劃線組成,而且不能以數字開頭;

3)當變量內容帶有特殊字符(如空格)時,需要加上單引號;

當變量內容中帶有單引號時,需要用到雙引號

4)如果變量內容中需要用到其他命令運行結果則可以使用反引號;

5)變量內容可以累加其他變量的內容,需要加雙引號;累加其他變量時如果爲單引號則得出的結果非預期結果。

從上面的例子可看出,單引號和雙引號的區別:用雙引號時不會取消掉裏面出現的特殊字符的本身作用(這裏的$),而使用單引號則裏面的特殊字符全部失去它本身的作用。

在前面的例子中筆者多次使用了bash命令,如果在當前shell中運行bash指令後,則會進入一個新的shell,這個shell就是原來shell的子shell了,不妨你用pstree指令來查看一下。

pstree這個指令會把linux系統中所有進程通過樹形結構打印出來,你可以直接輸入pstree查看即可。在父shell中設定一個變量後,進入子shell後該變量是不會生效的,如果想讓這個變量在子shell中生效則要用到export指令。

export其實就是聲明一下這個變量的意思,讓該shell的子shell也知道變量a的值是123.如果export後面不加任何變量名,則它會聲明所有的變量。

在最後面連同我們自定義的變量都被聲明瞭,見上圖最後一行。

如果要取消某個變量,只要輸入「unset 變量名」即可。用unset a後,再echo $a則不再輸出任何內容。

 

三、配置系統環境變量與個人環境變量

1、系統環境變量:

/etc/profile :這個文件預設了幾個重要的變量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umas等等。

/etc/bashrc :這個文件主要預設umask以及PS1。這個PS1就是我們在敲命令時,前面那串字符了,例如筆者的linux系統PS1就是 [yan***[email protected]****.com ~]$ ,你不妨看一下PS1的值。

\u就是用戶,\H 主機名, \W 則是當前目錄,\$就是那個’#’(管理員顯示爲‘#’)了,如果是普通用戶則顯示爲’$’(我是普通用戶所以顯示爲‘$’)

2、除了兩個系統級別的配置文件外,每個用戶的主目錄下還有幾個這樣的隱藏文件:

.bash_profile :定義了用戶的個人化路徑與環境變量的文件名稱。每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次。

.bashrc :該文件包含專用於你的shell的bash信息,當登錄時以及每次打開新的shell時,該該文件被讀取。例如:將用戶自定義的alias或者自定義變量寫到這個文件中

.bash_history :記錄命令歷史用的。

.bash_logout :當退出shell時,會執行該文件。可以把一些清理的工作放到這個文件中。