shell腳本編程進階
一,流程控制
過程式編程語言
a.順序執行
b.選擇執行
c.循環執行
順序執行
顧名思義,就是按照你腳本裏所敲的內容順序執行
選擇執行
fi
a.條件選擇if語句,可以嵌套
b.格式
單支
if 判斷條件;then
條件為真
fi
雙分支
if 判斷條件;then
條件為真
else
條件為假
fi
多分支
if 判斷條件;then
條件為真
elif(相當於else if) 判斷條件;then
條件為真
else
上述條件都為假
fi
逐條進行判斷,第一次遇到真條件時,執行分支,然後fi結束整個if語句
看幾個例子,了解一下具體在腳本裏格式是什麽樣的
所有的腳本寫完之後的操作都一樣,就在這裏演示一次後面就都不演示了
case
a.case支持glob風格的通配符
* 任意長度任意字符 ? 任意單個字符 [ ] 指定範圍內的任意單個字符 a|b a或者b b.格式
case 變量引用 in
pat1) 分支;;
pat2) 分支;;
...
*) 分支;;
esac
循環執行
定義:將某代碼段重復運行多次,有進入條件和退出條件
for
a.格式
for 變量名 in 賦值列表;do
循環體
done
b.執行機制:依次將列表的元素賦值給變量名,每次賦值後執行一次循環體,知道列表中耗盡,循環結束
c.列表生成方式
(1)直接給出列表 {1,2,3}
(2)整數列表
(a){1..10}
(b)$(seq 1 10)
(3)返回列表的命令 $(cmd)
(4)變量引用 $@,$#
while
a.格式
while 循環控制條件;do
循環體
done
b.循環控制條件是true,進入循環,否則退出循環
c.特殊用法 遍歷文件的每一行
while read line;do
循環體
done < 文件名
依次讀取文件的每一行,並且賦值給$line
until
a.格式
until 循環控制條件;do
循環體
done
b.循環控制條件是false,進入循環,否則退出循環
continue
用於循環體中,提前結束第N層的本輪循環,進入下一輪N+1層循環
break
用於循環體中,提前結束第N層本輪循環
這倆個是在其他循環語句中應用,在其他示例的圖片裏一起講了
shift
shift n
用於參量列表,左移指定次數,不指定為左移一次;一旦被移動,最左端的參數從列表中刪除
select 用於創建菜單
a.格式
select variable in list;do
循環體命令
done
b.PS3提示符
c.輸入菜單的某個數字,執行相應的命令,是無線循環,需用break退出循環或者exit終止腳本
特殊用法
((...)) 可以用於運算
for ((變量初始化;條件判斷表達式;控制變量的修正表達式));do
循環體
done
每輪循環結束會先進行控制變量修正運算,然後再做條件判斷
二,函數
函數介紹
不是單獨的進程,不能獨立運行,是shell程序的一部分,在當前shell中運行
定義函數
a.方式一
函數名 () { 函數體;} 常用
b.方式二
function 函數名 { 函數體;}
c.方式三
function 函數名 () { 函數體;}
函數使用
a.可在交互式環境下定義函數
b.可將函數放在腳本文件中作為它的一部分
c.可放在只包含函數的單獨文件
d.函數只有被調用才會執行
函數返回值
return 從函數中返回,用最後狀態命令決定返回值,是0,則是無錯誤返回;是1-255,則是有錯誤返回
定義及使用函數
a.交互式環境
定義函數後,將一直保留到用戶從系統退出,或者執行unset 刪除函數,取消函數賦值
b.腳本中
調用函數直接調用函數名即可
載入函數
函數文件創建好後,用 . 或者source 接上文件名載入函數
執行shell函數
直接輸入函數名即可
函數參數
可以接受調用$1,$2,...這些參數,還有特殊變量
$@,$* 表示所有的參數
$# 表示參數個數
函數變量
a.環境變量
當前shell和子shell有效
b.本地變量
只在當前函數運行期間有效
c.全局函數
對當前shell有效
函數遞歸
函數直接或間接調用自身
三,數組
相關數組的含義
a.變量
存儲單個元素的內存空間
b.數組
存儲多個元素的連續的內存空間,相當於多個變量的集合
c.索引
從0開始,數值索引,declare -a 數組名 聲明數字索引
也可以自定義,為關聯索引,declare -A 數組名 聲明關聯索引
數組賦值
a.一次賦值一個元素
title[1]=a
b.一次賦值全部元素
title=(a b c ) 下標自動從0開始排
c.指定下標數
title=([0]=a [3]=b)
d.交互式賦值
read -a 數組名
引用數組
a.引用數組元素
${數組名[下標數]}
b.引用數組所有元素
${數組名[@|*]}
c.數組元素的個數
${#數組名[@|*]}
c.刪除數組或者元素
unset 數組名[下標值]
數組數據處理
a.引用數組中元素
${數組名[@] :i:j}
i:為正數時是從左往右跳過i個元素;為負數時是從右往左取出i個元素
j:為正數時是從左往右取出j個元素;為負數時是從右往左去掉j個元素
b.追加元素
數組名[${#數組名[@]}]=元素值
c.關聯數組
關聯數組必須先聲明再調用
d.顯示字符串長度
${#數組名}
四,高級字符串操作
基於模式取字符串
${數組名#*字符串} 從左往右開始刪除直到第一次出現匹配到字符串的所有字符
${數組名##*字符串} 從左往右開始刪除直到最後一次出現匹配到字符串的所有字符
${數組名%字符串*} 跟#用法一樣,但是是從右往左開始
查找替換
${數組名/匹配的字符串/替換的字符串} 第一次被匹配到的字符串,替換
${數組名//匹配的字符串/替換的字符串} 所有被匹配的字符串,替換
${數組名/#匹配的字符串/替換的字符串} 行首被匹配的字符串,替換
${數組名/%匹配的字符串/替換的字符串} 行尾被匹配的字符串,替換
查找刪除
與替換用法一樣,不輸入替換的字符串即可
字符大小寫轉換
${數組名^^} 把數組中的所有小寫字母換成大寫
${數組名,,} 把數組中的所有大寫字母換成小寫
五,高級變量
declare
有類型變量
如果declare -a 和 declare -A 後面沒有接變量名則表示顯示索引數組和關聯數組
eval
會先掃描所有的置換,然後執行命令;適用於一次掃描無法實現的變量;對變量進行倆次掃描
mktemp
創建並顯示臨時文件,可避免沖突
install
安裝復制文件
expect
a.介紹
主要應用於自動化交互操作的場景,就是把交互式操作成自動完成
shell腳本編程進階