您好,登錄后才能下訂單哦!
shell腳本編程
在講shell腳本編程前,先了解一下bash的顏色顯示規則:
bash的顏色顯示規則是按照ASCII編碼對顏色進行設置的;其一些常用的編碼有:
\033:Ctrl鍵;
[:控制顏色屬性命令;
0m:關閉顏色屬性命令;
1m:加粗顯示文本字符;
4m:為文本字符加下劃線標識;
5m:使文本字符閃爍;
7m:將文本字符的背景色和前景色交換顯示;
8m:將文本字符的背景色和前景色設置為相同顏色;
30m-39m:設置文本字符的前景色;38m和39m暫時保留;
40m-49m:設置文本字符的本景色;48m和49m暫時保留;
例子:echo -e "\033[5;37mhello world\033[0m" #顯示×××的閃爍的hello world
在Linux中一個完整的Linux程序,一般包括4類文件:
二進制文件(可執行文件)、頭和庫文件、幫助文件、配置文件
其中bash--CLI(命令行接口)的一種,屬于完整的應用程序,也有這四類文件;
bash的配置文件分為一下三類:
profile類:為交互式登陸的shell進程實現功能出事化的配置文件;
bashrc類:為非交互式登陸的shell進程實現功能配置的文件;
logout類:為交互式登陸的shell進程提供終止及清理類功能的配置文件;
shell的類型:
交互式登陸的shell:
1.直接通過某個終端輸入賬號和密碼后登陸打開的shell進程;
2.使用su - USERNAME 或su - USERNAME 執行切換登陸打開的shell進程;
非交互式登陸的shell:
1.在圖形界面下,透過菜單或右鍵菜單打開的終端的shell進程;
2.使用su USERNAME執行切換登陸打開的shell進程;
bash的配置文件:
profile類:
全局:對所有用戶都生效的配置;其目錄為:/etc/profile、/etc/profile.d/*.sh
注意:在RHEL或CentOS系列的操作系統中,通常情況下,如果一個配置文件內容很多,格式復雜,我們會將其切割成多個片段,將切割出來的片段統一的存放在“程序名稱.d”目錄中;在這樣目錄中所保存的片段文件,大多以統一的文件后綴名來命令;
用戶個人:僅僅只是針對某個用戶有效的配置文件;其目錄:~/.bash_profile
profile類配置的文件的作用:
1.用于定義用戶的環境變量;
2.用于運行腳本或執行命令;
bashrc類:
全局:/etc/bashrc
用戶個人:/.bashrc
bashlrc類配置的文件的作用:
1.用戶定義本地變量
2.用戶定義命令的別名;
3.定義umask;
注意:只有超級用戶root可以修改全局類的配置文件;普通用戶只能修改其家目錄中的個人配置文件;
交互式登陸的shell進程,會按照順序加載下列配置文件:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登陸的shell進程,會按照順序加載下列配置文件:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
所有在命令行中執行的命令的操作,只要沒涉及到文件的修改的,一般都只是針對當前的shell生命周期有效;只要shell進程結束,所有的設置均失效;
配置文件的作用;使得我們賴以生存的配置信息可以長期有效,只要不修改配置文件中的內容,每一次打開shell都會使曾經的配置生效;
讓配置文件中新定義的配置能夠立即生效的方式:
1.source命令:
格式:source /PATH/TO/SOME_CONF_FILES
. /PATH/TO/SOME_CONF_FILES
2.exec命令:
格式:exec /PATH/TO/SIME_CONF_FILES
bash中變量中存放的字符串處理方式:
弱變量:
1.無需事先定義即可使用;
2.沒有變量數據類型的硬性要求,默認是字符行;
1.字符串切片:
${#VAR}:返回字符串類型的變量VAR的長度;
${VAR:offset}:返回字符串變量VAR中第offset個字符后面的內容,不包括第offset個字符;offset的取值范圍為:0~$[${#VAR}-1]
${VAR:offset:number}:返回字符串變量VAR中從第offset個字符后開始,長度為number的字符部分;
${VAR: -length}:取字符串最右測的length個字符;
2.基于模式取字符串:
${VAR#*PATTERN}:自左而右,查找VAR變量所存儲的字符串中,第一次被PATTERN匹配的字符,刪除從字符串開始到PATTERN匹配的字符之間的所有字符;
${VAR##*PATTERN}:自左而右,查找VAR變量所存儲的字符串中,所有被PATTERN匹配的字符,刪除從字符串開始到最后一個PATTERN匹配的字符之間的所有字符;
${VAR%PATTERN*}:自右而左,查找VAR變量所存儲的字符串中,第一次被PATTERN匹配的字符,刪除從字符串結尾到PATTERN匹配的字符之間的所有字符;
${VAR%%PATTERN*}:自右而左,查找VAR變量所存儲的字符串中,第一次被PATTERN匹配的字符,刪除字符串結尾到最后一個PATTERN匹配的字符之間的所有字符;
3.查找替換:
${VAR/PATTERN/SUBSTRING}:在VAR變量中查找匹配PATTERN的內容,將其第一個匹配的結果更換成SUBSTRING;
${VAR//PATTERN/SUBSTRING}:在VAR變量中查找匹配PATTERN的內容,將其所有匹配到的結果都更換成SUBSTRING;
${VAR/#PATTERN/SUBSTRING}:在VAR變量中查找行首匹配PATTERN的內容,將匹配的結果更換成SUBSTRING;
${VAR/%PATTERN/SUBSTRING}:在VAR變量中查找行尾匹配PATTERN的內容,將匹配的結果更換成SUBSTRING;
4.查找刪除:
${VAR/PATTERN}:在VAR變量中查找匹配PATTERN的內容,將其第一個匹配到的結果刪除;
${VAR//PATTERN}:在VAR變量中查找匹配PATTERN的內容,將其所有匹配到的結果刪除;
${VAR/#PATTERN}:在VAR變量中查找匹配PATTERN的內容,將其行首匹配到的結果刪除;
${VAR/%PATTERN}:在VAR變量中查找匹配PATTERN的內容,將其行尾匹配到的結果刪除;
5.字符的大小寫轉換:
${VAR^^}:將VAR變量中的所有小寫字母轉換為大寫字母;
${VAR,,}:將VAR變量中的所有大寫字母轉換成小寫字母;
6.變量賦值:
${VAR:-value}:如果變量VAR為空或未被設置,那么直接返回value的值,否則返回變量VAR的值;
${VAR:+value}:如果變量VAR不為空,則返回value;
${VAR:=value}:如果變量VAR為空或為被設置,那么直接返回value的值,并且將value的值賦值給變量VAR;否則返回變量VAR的值;
7.變量的間接引用:
如果第一個變量的值的恰好是第二個變量的變量名,從第一個變量引用第二個變量的值的方法,就稱為變量的間接引用,也稱為間接變量引用;
數組
在了解數組前,我們先來聊聊變量,變量就是內存的存儲空間。它的特點:是每個變量中只能存放一個數據,變量只能進行一次性的賦值。但是當我們存放本班每個人的名字與變量時,我們有一下幾種方法:
1.一次性賦值:NAME="name1 name2 name3 ..."
2.使用多個變量,分別賦值:NAME1=xu、NAME2=shen;
3.數組變量
數組:存放一個或多個元素的連續的內存空間,相當于多個變量的集合;
數組元素:數組中任何一個存放數據的存儲單元;
數組的索引:
1.數子:索引數組(Index ARRAY)
2.名稱(字符串):關聯數組(Related ARRAY) bash5.0以上的版本才支持;
數組分兩種:
稠密數組:索引編號必須連續
稀疏數組:索引編號可以不連續,bash數組屬于此類;
數組的聲明方法:
1.declare命令:
declare -i NAME:將NAME聲明為整型變量;
declare -x NAME:將NAME聲明為環境變量;
declare -a NAME:將NAME聲明為索引數組;
declare -A NAME:將NAME聲明為關聯數組;
2.直接聲明數組:
直接為數組賦值:
ARRAY_NAME=("value1" "value2" "value3" ...) 聲明稠密數組;
ARRAY_NAME=([0]="value1" [1]="value2" [4]="value3" ...) 聲明稀疏數組
3.定義數組的元素而穿件數組:
ARRAY_NAME[0]=value1
ARRAY_NAME[1]=value2
...
引用數組中的元素:
引用變量的方法:${NAME}
引用數組元素的方法:${ARRAY_NAME[INDEX]}
注意:如果不給出INDEX,則表示引用數組的第一個元素,即INDEX=0的元素;
引用整個數組的所有元素:${ARRAY_NAME[*]}或者${ARRAY_NAME[@]}
引用數組的索引:${!ARRAY_NAME[*]}或者${!ARRAY_NAME[@]}
查看數組的長度(數組中有效元素的個數)${#ARRAY_NAME[*]}或者${#ARRAY_NAME[@]}
數組切片:
${ARRAY_NAME:offset}:顯示包括offset數字所表示的索引位置及以后的所有元素;
${ARRAY_NAME:offset:number}:顯示包括offset數字所表示的索引位置及以后的number個元素;
向數組中追加元素:
1.稠密數組: ARRAY_NAME[${ARRAY_NAME[*]}]=valueN
2.稀疏數組:ARRAY_NAME[INDEX]=value 注意:INDEX必須為未被使用的數組元素索引編號
撤銷數組:usnet ARRAY_NAME
刪除數組中的元素:unset ARRAY_NAME[INDEX]
shell腳本編程
特點:過程式編程、腳本類編程、解釋型編程
過程式編程語言:
順序執行結果:
以從左到右,從上到下順序執行所有的語句(命令)
shell腳本的主體結構;
選擇執行結構:
依照給定條件的邏輯判斷結果或者依照可選的取值范圍,進而選擇某個分支中的語句倆執行;
if:分支選擇標準,邏輯判斷的結果;
case:分支選擇標準,根據可選的取值;
循環執行結構:
對于某特定語句,重復執行0次,1次或多次;
for:遍歷指定的列表;
while:根據邏輯判斷的結果;
until:根據邏輯判斷的結果;
select:死循環,利用循環機制提供選擇列表;
選擇執行結構:
if語句:if 命令;then 命令;[elif 命令;then 命令;]... [else 命令 ;] fi
if語句單分支結構:如果條件為真,則執行then后的命令,否則,不做任何操作;
格式:
if CONDITOIN then STATEMET fi if CONDITION ; then STATEMENT1 STATEMENT2 ... fi
注意:想要執行then后面的STATEMENTS,前提條件是CONDITION部分為真;
if語句的雙分支結構:如果條件為真,就執行then后面的命令,否則就執行else后面的命令;
if CONDITION ; then STATEMENT ... else STATEMENT ... fi
if語句的多分支結構:首先判斷CONDITION1是否為真,如果為真,則執行第一個then后面的語句;否則就判斷CONDITION2是否為真,如果為真,就執行第二個then后面的語句;否則就判斷CONDITION3是否為真,如果為真,就執行第三個then后面的語句...如果所有的CONDITION都為假,就執行else后面的語句;
if CONDITION1 ;then STATEMENT ... elif CONDITION2 ; then STATEMENT ... elif CONDITION3 ; then STATEMENT ... ... else STATEMENT ... fi
建議:if多分支結構,能不用就不用
循環執行結構:
將一段代碼重復的執行0次,1次或多次;
一個好的循環結構,必須要包括連個重要的環節:
進入循環的條件:
開始循環時所滿足的條件;
退出循環的條件:
循環結束所滿足的條件;
for循環:
1.遍歷列表
for VAR_NAME in LIST ; do 循環體; done for VAR_NAME in LIST ; do 循環體 done
VAR_NAME:任意指定的變量名稱,變量的值是從LIST中取值并賦值的;
循環體:一般來說是能夠用到VAR_NAME的命令或命令的組合;如果循環體中沒有包括VAR_NAME,則可能出現死循環;
LIST的生成方式 :
1)直接給出
2)純整數列表
3)花括號展開
4)命令的執行結果的返回值
5)GLOBBING
6)某些變量的引用:$@, $*
2.控制變量
for ((表達式1; 表達式2; 表達式3 ));do 命令;done for ((表達式1; 表達式2; 表達式3 ));do 循環體 done
表達式1:為變量賦初始值
表達式2:循環的退出條件
表達式3:變量值的變化規律
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。