1. 程式人生 > >Linux學習之bash基礎特性

Linux學習之bash基礎特性

1、bash基礎特性之命令歷史:shell程序會在其會話中儲存此使用者提交執行過的命令,shell程序啟動後所有當前執行過的命令都會儲存在shell程序的記憶體中;只有使用者登出時才儲存到檔案中。
(1)history命令

history命令用於檢視已經執行過的命令

[[email protected] lib]# history
    1  su root
    2  ls
    3  cd /
    4  poweroff
    5  cd /

注意:在正常關機時shell程序記憶體中快取的歷史命令會儲存在/root/.bash_history檔案中
(2)定製history功能:可通過環境變數實現

  • HISTSIZE:shell程序可保留的命令歷史條數
  • HISTFILE:持久儲存命令歷史的檔案——即歷史命令儲存的檔案位置
  • HISTFILESIZE:檔案中命令歷史檔案能儲存的大小

(3)history格式:
history -c:清空shell記憶體中快取的歷史命令

	[[email protected] lib]# history
    	1  history 10
    	2  history
    	3  history -d 2
    	4  history
	[[email protected] lib]# history -c
	[
[email protected]
lib]# history 1 history

history -d n:指定刪除第n條歷史命令
history -c:清空當前歷史命令;
history -a:將歷史命令緩衝區中命令寫入歷史命令檔案中;
history -r:將歷史命令檔案中的命令讀入當前歷史命令緩衝區;
history -w:將當前歷史命令緩衝區命令寫入歷史命令檔案中。
history number:顯示最近number條的命令

	[[email protected] lib]# history -c
	[[email protected] lib]# history
    	1  history
	[
[email protected]
lib]# history -r [[email protected] lib]# history 1 history 2 history -r 3 history 4 history -w 5 history 6 history -r

(4)呼叫命令歷史列表中的命令

  • !number:再執行歷史命令列中的第number條命令
  • !!:再一次執行上一條命令
  • ! string:再一次執行命令歷史列表中最近一次以string開頭的命令
    注意:命令重複執行依賴於冪等性
    冪等性:對同一個系統,使用同樣的條件,一次請求和重複的多次請求對系統資源的影響是一致的
    (5)呼叫上一條命令的最後一個引數
  • 先按ESC再按 · 號
  • 字串:!$
    (6)控制命令歷史記錄方式由環境變數HISTCONTROL變數記錄其方式,記錄方式有以下幾種
  • ignoredups:忽略重複命令
  • ignorespace:忽略以空白字元開頭的命令
  • ignoreboth:以上兩者同時生效
    (7)修改變數的值
	[[email protected] lib]# echo $HISTCONTROL
	ignoredups
	[[email protected] lib]# HISTCONTROL=ignoreboth
	[[email protected] lib]# echo $HISTCONTROL
	ignoreboth

2、bash常見特性之命令補全
(1)shell程式在接收到使用者執行命令請求,分析完成後,最左側的字串會被當做命令
(2)命令查詢機制:

	a、查詢內部命令
	b、據PATH環境變數中設定的目錄,自作而右逐個搜尋目錄下的檔名:
	   若打頭字串能唯一表示命令程式檔案,則直接補全
	   若不能唯一標識則再次敲擊Tab會給出以大頭字串開頭的列表

(3)路徑補全

	給定起始路徑下,以對應路徑下的打頭字串逐一匹配起始路徑下的每個檔案
	若能唯一標識某個路徑,則直接補全
	否則再一次敲擊Tab,給出列表

3、bash基礎特性之命令列展開
(1)~:次符號自動展開為使用者家目錄,或指定使用者的家目錄

	[[email protected] recover]# cd ~hu
	[[email protected] hu]# pwd
	/home/hu
	[[email protected] hu]# cd ~
	[[email protected] ~]# pwd
	/root

(2){}:可承載一個以逗號分隔的路徑列表,並能將其展開為多個路徑

	[[email protected] recover]# mkdir -pv ./test/{a,b,c}
		mkdir: created directory ‘./test/a’
		mkdir: created directory ‘./test/b’
		mkdir: created directory ‘./test/c’
	[[email protected] recover]# mkdir -pv {a,b}_{c,d}
		mkdir: created directory ‘a_c’
		mkdir: created directory ‘a_d’
		mkdir: created directory ‘b_c’
		mkdir: created directory ‘b_d’

4、bash基礎特性之命令執行狀態結果
(1)命令執行狀態結果:bash通過狀態返回值輸出此結果
(2)如何檢視結果

	[[email protected] ~]# echo $?
	0
	若查詢結果為0則表示成功
	若查詢結果為1~255則表示失敗

==注意:命令執行完成之後應立即檢視其狀態;因狀態返回值保存於bash的特殊變數中——$?之下
(3)引用命令執行結果

	a、[[email protected] ~]# echo $(command)——執行時先執行$()後執行echo
	b、[[email protected] ~]# echo $`command`——使用反引號,先執行反引號內容,後執行echo

5、bash基礎特性之引用
1、弱引用:" "
2、強引用:’ ’
3、命令引用:$() 反引號
6、bash基礎特性之快捷鍵
Ctrl+a:跳轉至命令首行
Ctrl+e:跳轉至命令列尾
Ctrl+u:刪除命令首行到游標處之間所有字元
Ctrl+k:刪除游標到行尾之間的所有字元
Ctrl+L:清屏
Ctrl+c:終止命令
7、bash基礎特性之萬用字元機制
(1)globing:檔名通配——一種匹配模式,整體檔名匹配,而非部分匹配!
(2)匹配模式:能實現對多個檔名同時進行匹配(如etc下所有以p開頭的目錄)

[[email protected] recover]# ll -d /etc/p*
drwxr-xr-x. 2 root root 4096 Oct 11 08:59 /etc/pam.d
-rw-r--r--. 1 root root 2392 Nov 26 07:39 /etc/passwd
-rw-r--r--. 1 root root 2433 Nov 26 07:38 /etc/passwd-
-rw-r--r--. 1 root root 1362 Jun  9  2014 /etc/pbm2ppa.conf
-rw-r--r--. 1 root root 2872 Jun 10  2014 /etc/pinforc

(3)萬用字元的元字元
A、* :匹配任意長度的任意字元

[[email protected] recover]# ll -d /etc/p*
drwxr-xr-x. 2 root root 4096 Oct 11 08:59 /etc/pam.d
-rw-r--r--. 1 root root 2392 Nov 26 07:39 /etc/passwd

B、:匹配任意單個字元

[[email protected] recover]# ll -d /etc/p?
drwxr-xr-x. 5 root root 4096 Oct 11 08:36 /etc/pm

C、[ ]:匹配指定範圍內任意單個字元,有以下幾種情況

第一種表示式
	[a-z]:所有的小寫字母
	[A-Z]:所有的大寫字母
	[0-9]:數字
	[a-z0-9]:字母和數字
[[email protected] recover]# ls /bin/ps[0-9]*
/bin/ps2ascii  /bin/ps2pdf    /bin/ps2pdf13  /bin/ps2pdfwr  /bin/ps2ps2
/bin/ps2epsi   /bin/ps2pdf12  /bin/ps2pdf14  /bin/ps2ps

第二種表示式
	[[:upper:]]:表示所有大寫字母
	[[:alnum:]]:表示所有字母和數字
	[[:alpha:]]:表示所有字母
	[[:digit:]]:表示所有數字
	[[:lower:]]:表示所有小寫字母
	[[:punct:]]:表示所有標點符號
	[[:space:]]:表示所有空白字元
注意:上面式子僅僅只能表示一位萬用字元,如有多位則寫多個格式
	[[email protected] recover]# ll /bin/ps[[:alnum:]]*
	-rwxr-xr-x. 1 root root   740 Mar  5  2015 /bin/ps2ascii
	-rwxr-xr-x. 1 root root  2794 Mar  5  2015 /bin/ps2epsi

D、[^]:匹配指定範圍內以外的任意單個字元

	[[email protected] recover]# ll /bin/ps[^[:digit:]]*
	-rwxr-xr-x. 2 root root 53329 Nov 19  2015 /bin/psed
	lrwxrwxrwx. 1 root root     9 Oct 11 08:48 /bin/psfaddtable -> psfxtable
	lrwxrwxrwx. 1 root root     9 Oct 11 08:48 /bin/psfgettable -> psfxtable

8、I/O重定向及管道
(1)程式=資料+指令
(2)資料來源:

	a、程式內部變數而來,資料量和變動量
	b、檔案提供資料

(3)程式都有IO

	a、可輸入裝置:檔案
		(鍵盤裝置,系統上常規檔案,網絡卡等)
	b、可用於輸出的裝置:檔案
		(顯示器檔案系統上的常規檔案、網絡卡的等)

(4)、程式資料流有以下三種情況

a、輸入的資料流:標準輸入(stdin)——例鍵盤
b、輸出的資料流:標準輸出(stdout)——如顯示器
c、錯誤輸出流:錯誤輸出(stderr)——比如顯示器

(5)、檔案描述符——fd——file descriptor

標準輸入——0
標準輸出——1
錯誤輸出——2

(6)、I/O重定向

輸出重定向

	A、覆蓋輸出重定向:將輸出的地方使用“>”符號可以更改定義到任何儲存地方
		比如:使用cat命令本來應該講結果輸出到顯示器上,使用“>”後就可以將其定義輸出到檔案中,而不在顯示器上顯示。且定義的檔案原內容會被輸出內容所覆蓋。
		[[email protected] io]# cat test.txt
		123243
		[[email protected] io]# cat test1.txt > ./test.txt
		[[email protected] io]# ls
		test1.txt  test.txt
		[[email protected] io]# cat test.txt
		one 
		two
		three
		listen
		new
		
	B、追加輸出重定向:使用“>>”符號將輸出內容定義到檔案中,且僅僅是在目標檔案尾部加上此次輸出的內容,並不覆蓋原內容。如下所示
		[[email protected] io]# cat test1.txt >> test.txt
		[[email protected] io]# cat test.txt
		123534
		one 
		two
		three
		listen
		new
		lie

	C、錯誤輸出重定向
		2 >:錯誤覆蓋輸出重定向
			[[email protected] io]# set -c 2>test1.txt
			[[email protected] io]# cat test1.txt
			-bash: set: -c: invalid option
			set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
		2 >>:錯誤追加輸出重定向
			[[email protected] io]# set -c 2>>test.txt
			[[email protected] io]# cat test.txt
			one 
			two
			three
			listen
			new
			lie
			believe
			let
			better
			much
			-bash: set: -c: invalid option
			set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
			
	D、合併標準輸出重定向和錯誤輸出重定向
		&>:合併覆蓋標準輸出重定向
			[[email protected] io]# cat ./tt.txt > test.txt 2>&1
			cat: ./tt.txt: No such file or directory
		&>>合併追加標準輸出重定向
			[[email protected] io]# cat ./tt.txt >> test.txt 2>&1
			[[email protected] io]# cat test.txt
			cat: ./tt.txt: No such file or directory
			cat: ./tt.txt: No such file or directory
			cat: ./tt.txt: No such file or directory
			cat: ./tt.txt: No such file or directory
			
輸入重定向
	A、輸入重定向使用  < 符號
		[[email protected] io]# tr sufc SUFC < ./test.txt >> test1.txt  //將test.txt中內容輸入時將其內部指定的小寫字母轉換為大寫字母后重定向輸出到test1.txt中。
		[[email protected] io]# cat test.txt
		cat: ./tt.txt: No such file or directory
		Cat: ./tt.txt: No SUCh File or direCtory
	B、<<並不是輸入追加,而是Here Document——即將鍵盤輸入的顯示出來,或者重定向新增至檔案中
	[[email protected] io]# cat >>test1.txt << end      //將鍵盤輸入的字元重定向輸入到test1.txt檔案中,以end結束輸入
	> test1
	> test112
	> test23
	> test5443
	> ejgjgiodjfgoi
	> end
	[[email protected] io]# cat test1.txt
	test1
	test112
	test23
	test5443
	ejgjgiodjfgoi

(7)管道符

A、作用:連線程式,實現將前一個程式命令的輸入直接定向後一個程式輸入
B、格式:command1 |command2 |command3 ...

注意:特殊裝置:/dev/null;不管什麼資料送到此裝置中都會被清空

9、bash特性之命令hash

1)、bash指令碼程式設計
	終端:附著在終端的介面程式
		GUI:KDE 、Gnome、xfce
		CLI:/etc/shells(bash、csh、zsh)
2)、hash命令:(對內部命令無效——對內部命令的記錄無效)在PATH路徑中儲存已經執行過命令的完整路徑,下次再執行此命令時就直接使用此處路徑而不用查詢PATH全部路徑。
3)、hash使用
	(1)使用格式
		hash [-lr] [-p pathname] [-dt] [name ...]
	(2)option
		hash:無引數時為檢視hash表
		[[email protected] ~]# hash
		hits	command
   	    1	/usr/bin/mktemp
   	 hash -d:後面加命令,清除指定hash表命令
   	 hash -r:清空所有hash表
 	(3)、hash快取機制:key—value(建值資料)
 		key:查詢標準——搜尋鍵
 		value:查詢結果——值

10、bash特性之變數——為程式提供資料

1)、程式:由指令+資料(另一種描述:演算法+資料結構)
	指令:有程式檔案提供
	資料:標準輸入(IO裝置)、檔案、管道
	(變數名稱其實是指一段記憶體空間)
2)、變數:由其所指變數+儲存記憶體空間組成
	a、變數賦值:——不同於bash方式
		name=value(儲存到該變數名所指記憶體)
	b、變數型別:(指變數儲存中值的型別)儲存格式、表示資料範圍、參與運算
	c、程式語言型別:
		強型別變數:規定的是哪種型別就不能改變或和其他型別運算(強型別一般需要先宣告)——C語言
		弱型別變數:bash弱型別將所有變數統統視作字元型
		(bash不支援浮點行資料,若需要使用只能藉助外部變數;bash變數無須先宣告,bash變數需要先初始化避免其隨機值)
	例:
		[[email protected] ~]# test1=2345
		[[email protected] ~]# echo $test1
		2345
3)、變數替換:將變數名所出現的地方轉換為變數名所指記憶體空間資料的過程
4)、變數引用:
		格式—${var-name} 或 $var-name
5)、變數名:變數名只由數字、字母、下劃線組成,且不能由數字開頭
		變數名名命名法則:見名知意,命名機制遵循某種法則;且不能使用程式的保留名(如:if、else、then)
6)、bash變數型別(據作用範圍分為:本地、環境、區域性、位置、特殊)
	A、本地變數:shell作用域僅限於當前shell——如alias就僅僅限於當前shell
		a、變數賦值:name=value
		b、變數引用:
				${name}、$name
				" ":弱引用變數名會替換為其值
				' ':強引用變數名不會替換為其值
		c、檢視變數:set
			撤銷變數:unset name(此處非變數引用不能加$)
			
	B、環境變數:作用域為當前shell及其子shell程序
		a、變數賦值:
			export name=value
			name=value
			export name
			declare -x name=value
			declare -x name
		b、變數引用:${name}、$name
		注意:bash內嵌了許多環境變數,用於定義bash的工作環境——通常為大寫的字母
		如:PATH  HISTSIZE HISEFILE
		c、檢視環境變數:export、declare -x、printenv、env
			撤銷環境變數:unset name
		d、只讀變數——c中常量,不允許隨意改變其值
			格式:declare -r name
				readonly name
			注:只讀變數無法重新賦值,並且不支援撤銷,shell程序結束後自動消失
			
	C、區域性變數:作用域僅為某程式碼片段——函式上下文(週期之內)
	D、位置引數變數:向執行指令碼的shell程序傳遞引數
	E、特殊變數:shell內建有特殊功能的變數(如:$?中儲存了上一個命令執行的狀態——0表示成功,1~255表示失敗)

11、bash特性之多命令執行

1)、多命令執行格式
	~]# command1 command command .....
		命令執行順序從左到右依次執行
2)、邏輯運算
	(1)運算數只有真假
				真=>true、yes、1
				假=>no、off、0
	(2)幾種邏輯運算
			與——>&
			或——>+
			非——>!
			異或
		a、短路法則
		例:表示將兩個命令做與運算
			~]#  command1 && command2
			若command1—假,則command2不會再執行
			若command1—真,則command2必須執行
			[[email protected] ~]# cat test.txt && touch test.txt
			cat: test.txt: No such file or directory
			[[email protected] ~]# ls
			anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  Templates
			Desktop          Downloads  Music                 Public    Video
			
		例:表示兩個命令做或運算
			~]#  command1 || command2
			若command1—假,則command2必須執行
			若command1—真,則command2不會再執行
			[[email protected] ~]# cat test.txt || rm -rf test.txt
			[[email protected] ~]# ls
			anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  Templates  Videos
			Desktop          Downloads  Music                 Public    test.txt

12、shell程式設計的實現

1、程式語言的分類——據其執行方式分為以下兩類
	1)、編譯執行:原始碼由編譯器轉換為二進位制程式檔案,然後執行程式檔案——編譯器不參與檔案運算
	2)、解釋執行:原始碼執行時啟動直譯器程式,由直譯器檢查邏輯無誤後解釋一句執行一句——邊解釋邊執行
2、據其程式設計過程中功能的實現是呼叫庫還是呼叫外部程式檔案
	1)、shell指令碼程式設計:利用系統上的命令及程式設計元件進行程式設計
	2)、完整程式設計:利用庫或程式設計元件進行程式設計
3、據程式設計模型分類
	1)、程序式程式設計語言:以指令為中心來組織程式碼,資料是服務於程式碼
	2)、物件的程式語言:以資料為中心來組織程式碼,指令是服務於資料
		——物件:一個物件代表一種資料型別、模式
		——類(class):例項化為物件
4、shell指令碼程式設計特性:程序式程式設計;依賴外部程式檔案執行
5、如何寫shell指令碼
	1)、指令碼第一行頂格;給出shebang——直譯器路徑,用於指明直譯器執行當前指令碼的直譯器程式檔案
	2)、常見直譯器
		#!/bin/bash 
		#!/usr/bin/python
		#!/usr/bin/perl
6、shell指令碼是什麼:命令堆積——許多命令不具有冪等性,需要程式邏輯來判斷執行條件是否滿足,以避免執行中發生錯誤。
7、如何執行指令碼
	1)、賦予可執行許可權,並直接執行此程式檔案
		賦予可執行許可權:chmod +x test.sh
		在相對路徑下執行:./test.sh
	2)、直接用直譯器來執行
		如:bash test.sh
	注意:
		a、指令碼中空白行會被直譯器忽略
		b、指令碼中除了shebang,餘下的所有以#開頭的都會被視作註釋行而忽略
		c、shell指令碼中的執行時通過執行一個子shell程序實現的

pstree:用於檢視程序樹
13、bash的配置檔案

1、bash配置檔案分為兩個大類
	A、profile類:為互動式登入的shell程序提供配置
	B、bashrc類:為非互動式登入的shell程序提供配置
2、登入型別
	A、互動式登入:直接通過某終端輸入賬號、密碼後登入開啟的shell程序,或使用su命令(su - username;su -l username)格式執行的登入切換
		互動式登陸的執行流程:/etc/profile ---> /etc/profile.d ---> ~/bash_profile ---> ~/bashrc ---> /etc/bashrc。
	B、非互動式登入:使用su username格式執行的登入切換,圖形介面下開啟的終端執行指令碼的時候
		非互動式登陸的執行流程:~/.bashrc ---> ~/.bash_profile ---> /etc/profile.d/*.sh
3、bash配置檔案詳解
	1)、profile類檔案
		A、全域性配置:對所有使用者都生效(所有檔案:/etc/profile、/etc/profile.d/*.sh)
			a、/etc/profile檔案:Linux/etc/profile檔案的改變會涉及到系統的環境,也就是有關Linux環境變數的東西,學習Linux要了解Linuxprofile檔案的相關原理,這裡對則以檔案進行具體分析。
			b、/etc/profile.d/*.sh:目錄中存放的是一些應用程式所需的啟動指令碼,其中包括了顏色、語言、less、vim及which等命令的一些附加設定。
									 這些指令碼檔案之所以能夠 被自動執行,是因為在/etc/profile 中使用一個for迴圈語句來呼叫這些指令碼。而這些指令碼檔案是用來設定一些變數和執行一些初始化過程的。
		B、使用者個人僅對當前使用者有效—— ~/.bash_profile
		C、
			a、用於定義環境變數
			b、執行命令或指令碼
	2)、bashrc類
		A、全域性配置——/etc/bashrc
		B、使用者個人配置—— ~/.bashrc 
		C、功能:
			a、定義本地變數程序
			b、定義命令別名
	注意:僅管理員可修改全域性配置檔案
		   命令列中定義的特性,如變數和別名作用域為當前shell程序的生命週期;配置檔案定義的特性僅針對隨後新啟動的shell程序有效
	3)、如何讓配置檔案定義的特性立即生效
		a、通過命令列重複定義一次
		b、讓shell程序重讀配置檔案
			~]# source /path form file
			~]# ./path/
	注意:如何讓定義的配置永久生效:在/.bashrc中新增配置