1. 程式人生 > >CentOS系統Shell編程語言基礎之Bash的基礎特性簡介

CentOS系統Shell編程語言基礎之Bash的基礎特性簡介

刪除行 不同 pri 一個 test 局部變量 同時 執行命令 per

bash的基礎特性之命令歷史:

命令歷史:shell進程會在其會話中保存此前用戶提交執行過的命令
~]#history
定制history的功能,可通過環境變量實現
HISTSIZE:shell進程可保留的命令歷史的條數
HISTFILE:持久保存命令歷史的文件, “.bash_history”
HISTFILESIZE:命令歷史文件的大小

命令用法:

history [-c] [-d offset] [n]
or history -anrw [filename]
or history -ps arg [arg...]

命令常用選項:

-c:清空命令歷史
-d offset:刪除指定命令歷史
-r:從文件讀取命令歷史至歷史列表中

-w:把歷史列表中的命令追加至歷史文件中

history +數字:顯示最近的“數字”條命令

調用命令歷史列表中的命令:

!+數字:再一次執行歷史列表中的第“數字”條命令
!!:再一次執行上一條命令
!STRING:再一次執行命令歷史列表中最近一個以STRING開頭的命令

註意:命令的重復執行有時候需要依賴於冪等性

調用上一條命令的最後一個參數:
快捷鍵:ESC ,.
字符串:!$

控制命令歷史記錄的方式:
環境變量:HISTCONTROL
ignoredups:忽略重復的命令
ignorespace:忽略以空白字符開頭的命令
ignoreboth:以上兩者同時生效

修改變量的值: NAME=‘VALUE‘,此修改只對當前shell有效

bash的基礎特性之命令補全:

命令補全:shell程序在接收到用戶執行命令的請求,分析完成之後,最左側的字符會被當作命令

命令查找機制:
查找內部命令
根據PATH環境變量中設定的目錄,自左而右逐個搜索目錄下的文件名

給定的打頭字符串如果能唯一標識某命令程序文件,則直接補全;
給定的打頭字符串如果不能唯一標識某命令程序文件,再擊tab鍵一次,會給出列表

路徑補全:
在給定的起始路徑下,以對應路徑下的打頭字符串來逐一匹配起始路徑下的每個文件

tab:如果能唯一標識某命令程序文件,則直接補全;如果不能唯一標識某命令程序文件,再擊tab鍵一次,會給出列表

bash的基礎特性之命令行展開:

~:自動展開為用戶的家目錄,或指定用戶的家目錄

{}:可承載一個以逗號分隔的路徑列表,並能夠將其展開為多個路徑
例如:/tmp/{a,b}相當於/tmp/a /tmp/b

bash的基礎特性之命令的執行狀態結果

命令執行的狀態結果:
bash通過狀態返回值來輸出此結果
成功:0
失敗:1-255
命令執行完成之後,其狀態返回值保存於bash的特殊變量”$?”中, ~]#echo $?

命令正常執行時,有的還會有命令返回值,根據命令及其功能不同,結果各不相同

引用命令的執行結果:
$(COMMAND) 或COMMAND

bash的基礎特性之引用:

強引用:‘’
弱引用:“”
命令引用:``(~位置)

bash的基礎特性之快捷鍵:

Ctrl+a:跳轉至命令行行首
Ctrl+e:跳轉至命令行行尾
Ctrl+u:刪除行首至光標所在處之間的所有字符
Ctrl+k:刪除光標所在處至行尾的所有字符
Ctrl+l:清屏,相當於clear命令

bash的基礎特性之globbing(文件名通配機制):

globbing:文件名通配機制(整體文件名匹配,而非部分)

匹配模式:元字符
:匹配任意長度的任意字符
pa
:以pa開頭的所有文件
pa:文件名包含pa的文件
*pa:以pa結尾的文件

?:匹配任意單個字符
pa?:匹配以pa開始的下一個為p或a中任意一個的文件

[]:匹配指定範圍內的任意單個字符
有幾種特殊格式:
[a-z],[A-Z],[0-9],[a-z,0-9]

[^[;upper;]]:所有非大寫字母

pa[0-9][0-9], ?2[0-9]0-9

練習1:顯示/var目錄下所有以l,以小寫字母結尾,且中間出現一位任意字符的文件或目錄
ls -d /var/l?[;lower;]
練習2:顯示/etc目錄下,以任意一位數字開頭,且以非數字結尾的文件或目錄
ls -d /etc/[0-9][^0-9]
練習3:顯示/etc目錄下,以非字母開頭,後面跟一個字母及其任意長度任意字符的文件或目錄
ls -d /etc/[^a-z][a-z]

練習4:復制/etc目錄下,所有以m開頭,以非數字結尾的文件或目錄至/tmp/magedu.com目錄
cp -r /etc/m[^0-9] /tmp/magedu.com
練習5:復制/usr/share/man目錄下,所有以man開頭,後跟一個數字結尾的文件或目錄至/tmp/man目錄下
cp -r /usr/share/man/man[0-9] /tmp/man
練習6:復制/etc目錄下,所有以.conf結尾,且以m,n,r,p開頭的文件或目錄至/tmp/conf.d目錄下
cp -r /etc/[mnrp]
.conf /tmp/conf.d

bash特性之命令hash:

緩存此前命令的查找結果:key-value
key:搜索鍵,value:值
?
hash命令
? ?hash:列出
? ?hash -d command :刪除
? ?hash- r :清空
bash的特性之變量:

程序:指令+數據
指令:由程序文件提供
數據:IO設備、文件、管道、變量
?
程序:算法+數據結構
?
變量名+指向的內存空間
?
變量賦值:name=value
變量類型:存儲格式、表示數據範圍、參與的運算
? ? 編程語言:
? ? ? ? ? ? 強類型變量
? ? ? ? ? ? 弱類型變量:
? ? ? ? ? ? ? ? ? ?bash把所有變量統統視作字符型
? ? ? ? ? ? ? ? ? ?bash中的變量無需事先聲明,相當於把聲明和賦值過程同時實現
? ? ? ? ? ? ? ? ? ? ? ? ? 聲明:聲明其類型,定義出其變量名稱
?
? ? ? ? ? ? 變量替換:把變量名出現的位置替換為其所指向的內存空間中數據
? ? ? ? ? ? 變量引用:${var_name},$var_name
? ? ? ? ? ? 變量名:變量名只能包含數字、字母和下劃線,而且不能以數字開頭
? ? ? ? ? ? 變量名:見名知義,命名機制遵循某種法則;不能夠使用程序的保留字,例如if,else,then,while等
?
? ? ? ? bash變量類型:
? ? ? ? ? ? ?本地變量:作用域僅為當前shell進程
? ? ? ? ? ? ?環境變量:作用域為當前shell進程及其子進程
? ? ? ? ? ? ?局部變量:作用域僅為某代碼片段(函數上下文)
? ? ? ? ? ? ?位置參數變量:向執行腳本的shell進程傳遞的參數
? ? ? ? ? ? ?特殊變量:shell內置的有特殊功用的變量
? ? ? ? ? ? ? ? ? ? ? $?:用於執行上一個命令的執行狀態結果
?
? ? ? ? ? ? ? ? 本地變量:
? ? ? ? ? ? ? ? ? ? 變量賦值:name=value
? ? ? ? ? ? ? ? ? ? 變量引用:${var_name},$var_name
? ? ? ? ? ? ? ? ? ? ? ? ?“”:變量名會替換為其值
? ? ? ? ? ? ? ? ? ? ? ? ?‘’:變量名不會替換為其值
? ? ? ? ? ? ? ? ? ? 查看變量:set
? ? ? ? ? ? ? ? ? ? 撤銷變量:unset name
? ? ? ? ? ? ? ? ? ? ? ? ? ? 註意:此處非變量引用
?
? ? ? ? ? ? ? 環境變量:
? ? ? ? ? ? ? ? ? 變量賦值:
? ? ? ? ? ? ? ? ? ? ? (1)export name=value
? ? ? ? ? ? ? ? ? ? ? (2)name=value
? ? ? ? ? ? ? ? ? ? ? ? ? ?exportname
? ? ? ? ? ? ? ? ? ? ?(3)declare -x name=value
? ? ? ? ? ? ? ? ? ? ?(4)name=value
? ? ? ? ? ? ? ? ? ? ? ? ? declare -x name
? ? ? ? ? ? ? ? ? ? ?變量引用:${name},$name
?
? ? ? ? ? ? ? 註意:bash內嵌了許多環境變量(通常為全大寫字符),用於定於bash的工作環境 (PATH,HISTFILE,HISTSIZE,HISTFILESIZE,UID)
?
? ? ? ? ? ? ? ? ?查看環境變量:export,declare -x,printenv,env
? ? ? ? ? ? ? ? ?撤銷變量:unset name
?
? ? ? ? ? 只讀變量:
? ? ? ? ? ?(1)declare -r name
? ? ? ? ? ?(2)readonly name
?
? ? ? ? ? ? ? ? 註意:只讀變量無法重新賦值,並且不支持撤銷,存貨時間為當前shell進程的生命周期,隨shell進程終止而終止
?
?
bash特性之多命令執行:

~]#COMMAND1;COMMAND2;COMMAND3;...
?
邏輯運算:
? ? ? 運算數:真(true,yes,on,1)
? ? ? ? ? ? ? ? ? ? ? 假(false,no,off,0)
?
? ? ? ? ? ?與:
? ? ? ? ? ? ? ?1 && 1 = 1
? ? ? ? ? ? ? ?1 && 0 = 0
? ? ? ? ? ? ? ?0 && 1 = 0
? ? ? ? ? ? ? ?0 && 0 = 0
? ? ? ? ?或:
? ? ? ? ? ? ? 1 || 0 =1
? ? ? ? ? ? ? 1 || 1 =1
? ? ? ? ? ? ? 0 || 1 =1
? ? ? ? ? ? ? 0 || 0 =0
? ? ? ? ?非:
? ? ? ? ? ? ? ! 1 = 0
? ? ? ? ? ? ? ! 0 = 1
?
? ?短路法則:
? ? ? ? ?~]#COMMAND1 && COMMAND2
? ? ? ? ? ? ? ? COMMAND1為“假”,則COMMAND2不會再執行
? ? ? ? ? ? ? ? 否則,COMMAND1為“真”,則COMMAND2必須執行
?
? ? ? ? ? ? 例:[root@localhost ~]# touch /tmp/test.etc && ls /etc > /tmp/test.etc
? ? ? ? ? ? ? ? ?[root@localhost ~]# cat /tmp/test.etc
?
? ? ? ? ?~]#COMMAND1 || COMMAND2
? ? ? ? ? ? ? ? COMMAND1為“真”,則COMMAND2不會再執行
? ? ? ? ? ? ? ? 否則,COMMAND1為“假”,則COMMAND2必須執行
?
? ? ? ? ? ? ?例:[root@localhost ~]# id user1 || useradd user1
? ? ? ? ? ? ? ? ?id: user1:無此用戶
? ? ? ? ? ? ? ? ?[root@localhost ~]# id user1
? ? ? ? ? ? ? ? ? uid=2003(user1) gid=2003(user1) 組=2003(user1)

CentOS系統Shell編程語言基礎之Bash的基礎特性簡介