【Linux】bash基礎特性


1. bash初識

Shell程序是獨特的程序,這個程序提供了一個界面(就那黑乎乎的命令行界面,即Linux的終端界面),用戶通過這個界面訪問操作系統內核的服務,從而解析用戶提供的命令。而bash(Bourne Again Shell)是衆多Shell的一種,也是大部分Linux系統的默認Shell。

用戶
Shell
內核
底層硬件

2. bash特性

2.1 命令相關

2.1.1 命令歷史:history

shell進程會保存此前用戶用過的命令,利用history命令可查看或者設置命令歷史相關參數。

  • history的一些常用選項:
      history [OPTIONS]
	-d:delete,刪除歷史命令中指定的命令;
	-c:clear,清空命令歷史;
	-a:add,手動增加當前會話緩衝區的命令歷史至歷史文件中;
	n:number,顯示最近使用的n條歷史命令

bash不單可以顯示出命令歷史,關鍵是還可以調用之前用過的命令,配合Tab鍵使用更佳。

  • 調用歷史命令:
	!#:重複執行第#條命令
	!!:重複執行上一條命令,這個比較常用
	!string:重複執行最近一次以string(可變)開頭的命令,這個比較常用
	!$:調用上一條命令的最後一個參數,好吧,這個也好用

若要控制命令歷史的記錄方式,可在/etc/prfofile配置文件中更改HISTCONTROL環境變量,其中

  • 控制命令歷史的記錄方式:
	ignoredups:忽略重複的命令,連續且相同方爲“重複”
	ignorespace:忽略所有以空白開頭的命令
	ignoreboth:等於以上兩者之和

其他history命令相關環境變量

  • history命令相關環境變量:
	HISTSIZE:命令歷史記錄的條數
	HISTFILE:~/.bash_history,命令歷史文件
	HISTFILESIZE:命令歷史文件 記錄歷史的條數

2.1.2 命令、路徑補全:Tab

在談及命令補全之前,首先我們得明白什麼是命令。當我們發起命令的時候,請求內核將某個二進制程序運行爲一個進程,此時程序由靜態變爲動態。命令本身也是一個可執行的程序文件,二進制格式的文件,也有可能會調用共享庫文件。一般這些命令文件都保存在bin,sbin,lib這些目錄中。

  • bash中的執行命令可以分爲兩種
	內部命令(builtin):內部命令沒有具體的二進制文件,而是由內核提供;
	外部命令:bash根據PATH環境變量定義的路徑,自左而右在每個路徑搜尋以給
			定命令名命名的文件,第一次找到即爲要執行的文件。

bash命令補全的方法,當命令按一半,發現不小心忘記命令全稱或完全忘記了命令名時,只要按下命令前幾個字母,再按下Tab鍵,即會顯示用戶給定的字符串所對應的命令,當用戶給定的字符串爲開頭的命令不唯一時,則再次按Tab鍵就會給出以字符串開頭的命令列表。Tap鍵用好了,事半功倍。

你也可以不敲字符串,直接按Tap鍵,會有驚喜哦。

路徑補全把用戶給出的字符串當作路徑開頭,並在指定上級目錄下搜索以指定的字符串開頭的文件名,如果唯一,則直接補全,否則,再次Tab鍵會給出以字符串爲開頭的路徑列表


2.1.3 命令別名:alias

命令別名類似於個性化設置,一些常用且繁瑣的命令可以在不和其他命令的名稱衝突的情況下,給它設置成一個相對簡單的命令。

舉個例子,編輯網卡配置文件的時候,可定義如下別名
alias cdnet='cd /etc/sysconfig/network-scripts/'

但是如此定義的命令別名只對當前shell(當前用戶)有效,即只配置在~/.bashrc中,若想對所有用戶有效,則需要定義在配置文件中,即/etc/bashrc中。


2.1.4 命令哈希:hash

linux系統下會有一個hash表,當你剛開機時這個hash表爲空,每當你執行過一條命令時,hash表會記錄下這條命令的路徑,就相當於緩存一樣。第一次執行命令shell解釋器默認的會從PATH路徑下尋找該命令的路徑,當你第二次使用該命令時,shell解釋器首先會查看hash表,沒有該命令纔會去PATH路徑下尋找,這樣可以大大提高命令運行的速度
  hash [OPTIONS] ...


2.1.5 I/O重定向

輸入/輸出設備(I/O device)是計算機系統中的四大基本組成(運算器、控制器、存儲器、輸入及輸出設備)之一,其重要性不言自明。在Linux中我們訪問文件的時候是通過鍵盤輸入某個文件名,{對於我們(用戶)來說是是一個文件名},然後在Linux系統中通過內核來識別文件名所對應的一個數字(文件描述符,file descripter),從而訪問文件。

Linux中一切皆文件,設備也可被描述爲文件。一般在Linux系統定義的標準輸入(stdin,standard input,命令在執行時所要的輸入數據通過它來取得)設備爲鍵盤,對應的文件描述符爲0,對應句柄位置爲/proc/slef/fd/0;標準輸出(stdout,standard output,命令在執行後的輸出結果從該端口送出)設備爲顯示器,對應的文件描述符爲1,對應句柄位置爲/proc/slef/fd/1;標準錯誤輸出(stderr,standard error output,命令執行時的錯誤信息通過該端口送出)設備爲顯示器,對應的文件描述符爲2,對應句柄位置爲/proc/slef/fd/2。

標準輸入/輸出可以理解爲Linux系統默認的輸入/輸出,而I/O重定向可以改變標準輸入/輸出的位置。

輸出重定向: 簡單來講可以把本來輸出到屏幕上的"hello,world"輸出到隨便哪個文件等作用。
  COMMAND >NEW_POS,COMMAND >>NEW_POS

	>:覆蓋重定向,目標文件彙總的原有內容會被清除
	>>:追加重定向,新內容會追加之目標文件尾部
		set -C:禁止將內容覆蓋輸出至已有文件中,如果需要強制覆蓋,則使用:>|
		set +C:關閉覆蓋已有文件的功能。2>:覆蓋重定向錯誤輸出流;2>>:追加重定向錯誤輸出流

例子:

  1. ls /etc/ > test.0,表示將/etc/目錄下的文件名覆蓋輸入至test.0中。

輸入重定向:<,<<,輸入重定向這個不常用,可起到讀取文件內容等作用。

例子:

  1. cat < test.1 > test.2,這個命令表示從test.1文件中讀取內容覆蓋輸出至test.2中;
  2. 又如tr 'a-z' 'A-Z' < /etc/fstab,表示將/etc/fstab文件中的小寫字母轉化爲大寫字母。

**注意:**重定向字符(<,<<,>,>>)後面若沒文件,即先執行字符後的內容,系統會自動先創建文件。

欲知更詳細內容可參考
(https://www.cnblogs.com/divent/p/5773861.html)
(https://blog.csdn.net/freeking101/article/details/81212207)


2.1.6 管道及多命令執行

管道(|)可以將一個命令的輸出導向另一個命令的輸入,從而讓兩個(或者更多命令)像流水線一樣連續工作,不斷地處理文本流。
  COMMAND 1|COMMAND 2|COMMAND 3...

Linux中還有其他類似的多命令執行的方式,如

每個命令之間用;隔開,其中各命令的執行結果不會影響其它命令的執行。也就是說各個命令都會執行, 但不保證每個命令都執行成功。

每個命令之間用&&隔開,若前面的命令執行成功,纔會去執行後面的命令。這樣可以保證所有的命令執行完畢後,執行過程都是成功的。

每個命令之間用||隔開||是或的意思,只有前面的命令執行失敗後纔去執行下一條命令,直到執行成功 一條命令爲止。


2.2 文件相關

2.2.1 文件名通配:glob

glob用於實現文件名通配,顯示指定條件的文件,即如果顯示以a開頭的所有文件,至於a後面是什麼我們不管,因此這裏有一個通配,常用的通配符有*、?、[](可通過查詢glob的幫助文檔來查看有哪些通配符,man 7 glob)

glob通配符:

	* 表示任意長度的任意字符
	? 表示任意單個字符
	[]  匹配指定範圍內的任意單個字符
	[0-9]  任意單個數字
	[a-z]  任意單個字母(不區分字母的大小寫)
	[a-z0-9]  任意單個字母或數字
	[^]  匹配指定範圍外的任意單個字符
	[:alnum:]  表示所有的字母和數字
	[:alpha:]  表示所有的字母(不區分大小寫)
	[:digit:]  表示所有數字
	[:lower:]  表示所有的小寫字母
	[:punct:]  表示所有的標點符號
	[:space;]  表示所有的空白字符
	[:upper:]  表示所有的大寫字母

2.3 腳本編程相關

2.3.1 變量

bash中變量可分爲

本地變量:生效範圍爲當前shell進程,對當前shell之外的其他shell進程包括當前的shell的子shell進程均無效;

環境變量:生效範圍爲當前shell進程及子進程;

局部變量:生效範圍爲當前shell進程中某代碼片段(通常指函數);

位置變量:$1,…,$n,${10}來表示,用於放腳本在腳本代碼中調用通過命令行傳遞給他的參數;

特殊變量
$?:上個命令執行成功與否的結果
$0:表示命令本身
$#:傳遞給腳本參數的個數
$*:傳遞給腳本的所有參數
$@:引用傳遞給腳本的所有參數


2.4 其他

2.4.1 快捷鍵

bash的快捷鍵:

	ctrl+I  相當於clear清屏
	ctrl+a  跳轉至命令開始處
	ctrl+e  跳轉至命令結尾處
	ctrl+c  取消命令的執行
	ctrl+u  刪除命令行首至光標所在處的所有內容
	ctrl+k  刪除命令行所在處至命令行尾的所有內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章