Linux Bash Shell簡介

作者最新博客地址:http://www.17mark.com

此簡書不再維護。

在解釋Bash shell之前,必須先介紹一下什么是shell。
讀者應該都知道,計算機是不能識別是任何人類語言的,其中也名手英語。計算機只能識別由0和1組成的機器碼,可是這些機器碼對正常智商的人類來說實在太難記憶了,那么人怎樣才能與計算機進行交流呢?就是使用命令解釋器。,人輸入類似英語的計算機命令到命令解釋器,再由這個命令解釋器將這些命令翻譯成計算機的機器指令交由計算機執行。在Linux或UNIX操作系統上,這個命令解釋器就叫shell。

5.1、shell的工作原理

其實當一個用戶以命令行方式登錄Linux或UNIX操作系統之后即進入了shell應用程序。使用xshell連接Linux系統登錄系統之后,就會進入shell的控制,

其中[dog@localhost ~]$就是shell的提示符。從此時shell就隨時恭候,等待您的差遣。并為您提供服務。

shell的功能是將用戶輸入的命令翻譯成Linux內核(Kernel)能夠理解的語言,這樣Linux的內核才能真正的操作計算機的硬件。

可以將shell看成用戶與Kernel之間的一個接口。shell主要是一個命令解釋器,它接收并解釋用戶輸入的命令,然后將他們傳給Kernel。最后由Kernel來執行這些命令。

5.2、bash的成長歷程

這里按書上順序列舉一下shell的名稱。大家可以自行百度。這里不再細說。

Bourn shell簡稱bsh 所有shell的始祖
C shell簡稱csh
Korn shell簡稱ksh
Z shell 簡稱zsh
TC shell 簡稱tcsh
Bourn-Again shell簡稱bash
這里可以查看一個自己系統中所有的shell



可以看到我這里只有bash。

5.3、使用type識別bash的內置命令

Linux操作系統的命令分為兩大類,一類是內部命令即內置在bash中的命令,另一類是外部命令(即該命令不是內置在bash中的)。
那么怎樣才能知道哪些命令是內部命令,哪些命令是外部命令呢,答案是使用type命令。

命令:man type

以上部分為內部命令,是不是還不少呀。

如果還想知道一些其它信息,就要用到type命令了
type [選項] 命令名
-t:顯示文件的類型,其文件類型如下。file為外部命令;alias為別名;builtin為bash的內置命令。
-a:列出所有包含指定命令名的命令,也包括別名(alias).
-P:顯示完整的文件名(外部命令),或者為內部命令。

這里不再一一演示,看圖吧

三個命令均顯示內置命令。

如何確定一個文件是可執行文件。還記得file命令嗎?
file /bin/pwd


其實除了type 命令還有which 或 whiatis命令來獲取命令的類型。
如圖:

可以看到這兩個命令確實可以獲取到一些信息,但不如type獲取的信息豐富。

來看一個外部命令。
type -t whoami

可以看到file為外部命令。

5.4、利用通配符操作文件

為了演示,首先給大家看一下目錄中的文件的名稱。

首先介紹一下Linux操作系統中提供的通配符。

*:將匹配0個(即空白),或多個字符。
?:將匹配任何一個字符而且只能是一個字符。
[a-z]:將匹配字符a~z范圍內的所有字符。
[^a-z]:將匹配所有字符但是a~z范圍內的字符除外。
[xyz]:將匹配方括號中的任意一個字符。
[^xyz]:將匹配不包括方括號中的字符的所有字符。

下邊開始舉例。

命令:ls *.wolf
顯示出結尾是wolf的文件。

命令:ls *.wolf.*
顯示中間為wolf的文件。

命令:ls dog?.wolf
顯示 前三個字符為dog第四個字符是任意字符,結尾是.wolf文件。

命令:ls dog??.wolf
顯示前三個字符為dog第四五個字符是任意字符,結尾是.wolf的文件。


為了后邊演示方便,此處再次touch兩個文件 dog1.wolf.girl dog2.wolf.boy
命令:ls dog[1-2].*
顯示dog1.和dog2.開頭的文件。

命令:ls dog[^1-2].*
顯示所有的不以dog1.和dog2.命名的文件。

其實不只是在ls命令中可以使用通配符,在其他的Linux指令中同樣也可以使用能通配符。如果想刪除文件名以dog開始,之后跟兩個數字隨后跟一個"."開頭的所有文件,就可以使用rm 通配符來刪除了。

如圖:
刪除成功dog11.wolf和dog21.wolf兩個文件已經不存在了。

5.5、利用tab鍵補齊命令行。

如果Linux命令記不清了,只記得前面幾個字符,該怎么辦,不要急Linux設計者早就高瞻遠矚地想到了這一點,現在就用了鍵盤上的 tab鍵了。

利如現在只記得whoami的命令的前四個字符。whoa然后按tab鍵,神奇不神奇。
不只是命令,也同樣適用玩目錄名稱和文件名稱等。這里不再多說。

5.6、命令行中~符號的使用

實際上符號的使用在第3章的3.4節中就簡單地介紹過,本節將更進一步地介紹符號的用法,~符號的含義如下:

(1)如果~符號后面沒有用戶名,則該符號代表當前用戶的家目錄。
(2)如果~符號后面跟一個用戶名,則該符號代表該用戶的家目錄。

命令:~
下面演示:

image.png

可以看到這樣可以訪問到worf文件夾。

命令:~用戶名

可以看到權限不足,因為dog用戶不能訪問cat用記的家目錄。所以咱們可以使用至高無上的root用戶進行操作。
可以看到顯示出了cat目錄下的dog文件夾。

5.7 history 命令與操作曾經使用過的命令。

絕大多數shell都會保留最近輸入的命令的歷史。這一機制可以使用戶能夠瀏覽、修改或重新執行,之前使用過的命令。使用history命令將列出用戶最近輸入過的命令(也包括您輸入的錯誤命令)。

命令history

在這里可以看到以前運行過的shell命令。
如果想要重新執行某個命令,比如第一條命令。那么可以這樣執行。
!n
執行編號為n的命令。比如!65
是不是成功了呢。
接下來如果想把命令ls dog[1-2].*中的2改成3。怎么做。在執行完!65后,再執行^2^3,就成功了。看圖:

此符號看起來作用不大,但在網絡測試中比ping IP時,用處就會很大。

Linux還提供了更實用的更豐富的功能。
1.利用鍵盤上的上下箭頭鍵在以前使用過的命令之間移動。
2.按CTRL+R鍵在命令的歷史記錄中搜尋一個命令。當按住CTRL+R時,會出現以下提示信息。


比如我要搜索 tail -4 /etc/passwd命令。那我只需要寫一個字符一個字符寫 后面會出現歷史記錄中的命令。
如圖流程:
輸入一個t時,出現了以下命令。不是咱們想要的
輸入ta時出現如下命令不是我們想要的
出現了吧?,F在可以直接回車,執行,也可以左右鍵頭鍵來進行編輯。

假如不是咱們想要的。比如我想要tail lists,那就繼續按CTRL+R,就會找下一個。方便吧。
還有一種。比如PING一個IP地址,可以一個點一個點打上去不太方便,可以在終端按住esc+.來查找以前ping過的IP。
不再演示。
Linux系統的歷史功能強大吧?

5.8、bash變量簡介及大括號{}的用法

shell變量就是內存中一個命了名的臨時存儲區。變量中所存儲的信息有以下兩種:

1.按用戶習慣定制shell所需的信息。
2.使一些進程正常工作所需的信息。
為了方便系統的管理和維護(也是為了系統的正常工作),Linux系統預定義了一些系統常用的變量。
這些變量用戶可以直接使用。

比如說系統中存在PATH的預定義變量,在這個變量中存放著執行一個命令時要搜尋的路徑,即如果一個命令存儲在PATH所列出的任何一個路徑中,用戶就可以只輸入命令名來運行這個命令,其中每一個路徑用:號隔開。如圖:

系統中還存在一個變量為$HOME變量,存放了當前用戶的家目錄。如圖:

初看起來,cd HOME命令用處也不大,因為完全可以使用cd ~命令來完成同樣的功能,其實不然,如果Linux(也可以是UNIX)上安裝了Oracle數據庫,要管理或維護Oracle系統的文件,此時使用cd ~命令就沒有辦法切換到Oracle的文件所在目錄,因為Oracle的文件的安裝目錄是存在了一個叫ORACLE_HOME的變量中,此時就可以使用cdORACLE_HOME切換到Oracle的安裝目錄,是不是很方便?

大括號的用法。

比如我想 touch兩個文件,baby.dog和baby.wolf,我可以如圖來創建。


但是我也可以這么來創建。
touch baby.{dog,worf}

是不是成功了。
假如我想創建 girl.dog girl.wolf boy.dog和boy.wolf
可以這樣 touch {girl,boy}.{dog,wolf}
方便吧。
其實不只是touch中可以這么用,其它命令中也可以這么用,比如rm
命令:rm baby.{dog,wolf}

成功。

5.9將一個命令的輸出作為另一個命令的參數

因為UNIX的原則是每一個命令都很簡單而且只完成單一的功能,因此想要完成比較復雜的工作時,可能就需要將一些命令組合在一起。例如,將一個命令的輸出結果作為另一個命令的輸入參數。

想要知道目前所使用的系統的主機名,可以使用如下命令:
命令:hostname


那么我們輸出自己的主機名
echo "This computer system's name is hostname"
結果是讓人失望的,因為顯示的不是自己的主機名,而還是hostname.
再輸入以下命令:echo "This computer system's name is `hostname`"
是不是成功了呢。
其實兩個反點號相當于**(hostname)** 例如這樣也是同樣的。![](https://upload-images.jianshu.io/upload_images/10034856-f8969dfa2fc144a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 別看``和()看上去挺簡單的,但是還挺管用的。

5.10、使用Linux命令進行數學計算。

首先在不定義變量的情況下是這樣的這不是我們想要的。

1.變量賦值

可以看到在定義賦值時,不要有空格。不然會出錯。
現在成功了。
現在我想要求一下語文成績和數學成績的總和。
注意有空格。不然是會出錯的。
格式就是這個樣子這里介紹一下其它的運算符:
+ - * / :加減乘除(除是整除)
%號是取余。
假如yuwencj=2 ; shuxuecj=3
兩個*是次方符,前面一個數的后面一個數次方,比如 echo [yuwencj$shuxuecj ]的意思是2的3次方。

5.11命令行中反斜線(\)的用法。

這里不講太多 反斜線也叫逃逸符號。即\后的特殊字符逃脫其特殊含義而恢復原來的字面意思。
比如 符號表示提取一個變量的值。如果要恢復此符的意思比如美元意思 那我就要在前邊加上$反斜線。

5.12Linux命令中引號的用法。


首先用雙引號和單引號輸出都是同樣的。那單引號和雙引號有什么區別呢?

(1)單引號(')禁止所有的命令行擴展功能
(2)雙引號("):禁止所有的命令行擴展功能但以下特殊字符除外。
(3)美元符號($):
(4)倒引號(`):
(5)反斜線():
(6)嘆號(!):

舉例說明:

例1:

例1說明,在price上邊加雙引號,結果還是顯示6839說明雙引號不能禁止符號。 例2:![](https://upload-images.jianshu.io/upload_images/10034856-d94e72bb97822ae1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)例2說明單引號可以禁止符。
例3:
例3說明單引號可以禁止倒引號(`)的功能。
例4:

輸出 $MAIL ,上圖第一個命令是因為反斜線是逃逸符號,它將恢復緊跟其后的的原本意思為了顯示\MAIL,試著加了個引號,也不能輸出想要的結果,說明引號不能禁止反斜線的功能。于是換成單引號,成功輸出,說明單引號可以禁止反斜線的功能。
例5:
假如我想輸出!61,上圖第一個命令,顯示的是以前的命令,因為 !61就是執行第61個歷史命令。所以為了要顯示!61這個字符串本身,試著加了個雙引號,結果還是歷史命令,說明雙引號不能禁止嘆號的功能,又試著加了個單引號,結果能輸出!61了,說明單引號可以禁止!號的功能。

5.13您應該掌握的內容

shell的工作原理
怎樣知道系統中有哪些shells及目前所使用的shell?
了解常用的shell及bash的發展過程。
利用type命令識別Linux命令的類型。
bash中常用的通配符。
怎樣在命令中靈活地使用通配符。
怎樣使用Tab鍵命令行的補齊功能?
使用~符號進行目錄的切換。
了解操作歷史命令方法及如何利用快捷鍵來提高工作效率。
了解bash變量及大括號{}的用法。
如何在Linux命令中使用倒引號(`)?
怎樣使用Linux命令和變量進行數學去算?
逃逸字符反斜線(\)的用法。
熟悉在Linux命令中單引號和雙引號的用法。


積極迎接各種挑戰,才會使自己更加強大。

歡迎一起交流,學習。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 官網 中文版本 好的網站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,433評論 0 5
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,203評論 2 33
  • Ubuntu的發音 Ubuntu,源于非洲祖魯人和科薩人的語言,發作 oo-boon-too 的音。了解發音是有意...
    螢火蟲de夢閱讀 99,467評論 9 467
  • 概述 首先,咱們來了解一下,什么是Shell。操作系統內核給我們提供了各種接口,同時也提供了各種用戶層的庫,理論上...
    keysaim閱讀 1,404評論 0 0
  • 1、bash 與 shell 管理整個計算機硬件的其實是操作系統的內核(Kernel),這個內核是需要被保護的,所...
    Zhang21閱讀 871評論 0 2