shell指令碼高階

2022-09-13 13:00:13 字數 4194 閱讀 4470

流程控制

程式設計中的邏輯處理:

順序執行

選擇執行

迴圈執行

迴圈

迴圈執行

將某**段重複執行多次

重複執行多少次

迴圈次數事先已知

迴圈次數事先未知

有進入條件和退出條件

for, while, until

for迴圈

for 變數名 in 列表;do

迴圈體done

執行機制:

依次將列表中的元素賦值給「變數名」; 每次賦值後即執行一次迴圈體; 直到列表中的元素耗盡,迴圈結束

列表生成方式:

(1) 直接給出列表

(2) 整數列表:

(a)

(b) $(seq [start [step]] end)

(3) 返回列表的命令

$(command)

(4) 使用glob,如:*.sh

(5) 變數引用

$@, $*

建立多個使用者的指令碼

列印九九乘法表

列印等腰三角形

while迴圈

condition:迴圈控制條件;進入迴圈之前,先做一次判斷;每一次迴圈之後會再次做判斷;條件為「true」,則執行一次迴圈;直到條件測試狀態為「false」終止迴圈

因此:condtion一般應該有迴圈控制變數;而此變數的值會在迴圈體不斷地被修正

進入條件:condition為true

退出條件:condition為false

隨機最大值和最小值

迴圈控制語句continue

用於迴圈體中

continue [n]:提前結束第n層的本輪迴圈,而直接進入下一輪判斷;最內層為第1層

while condtiiton1; do

cmd1

...if condition2; then

continue

ficmdn

...done

迴圈控制語句break

用於迴圈體中

break [n]:提前結束第n層迴圈,最內層為第1層

迴圈控制shift命令

shift [n]

用於將參量列表 list 左移指定次數,預設為左移一次。

參量列表 list 一旦被移動,最左端的那個引數就從列表中刪除。while 迴圈遍歷位置參量列表時,常用到 shift

函式介紹

函式function是由若干條shell命令組成的語句塊,實現**重用和模組化程式設計

它與shell程式形式上是相似的,不同的是它不是乙個單獨的程序,不能獨立執行,而是shell程式的一部分

函式和shell程式比較相似,區別在於

shell程式在子shell中執行

而shell函式在當前shell中執行。因此在當前shell中,函式可以對shell中變數進行修改

定義函式

函式由兩部分組成:函式名和函式體

help function

語法一:

f_name ()

語法二:

function f_name

語法三:

function f_name () {

...函式體...

函式使用

函式的定義和使用:

可在互動式環境下定義函式

可將函式放在指令碼檔案中作為它的一部分

可放在只包含函式的單獨檔案中

呼叫:函式只有被呼叫才會執行

呼叫:給定函式名

函式名出現的地方,會被自動替換為函式**

函式的生命週期:被呼叫時建立,返回時終止

函式返回值

函式有兩種返回值:

函式的執行結果返回值:

(1) 使用echo等命令進行輸出

(2) 函式體中呼叫命令的輸出結果

函式的退出狀態碼:

(1) 預設取決於函式中執行的最後一條命令的退出狀態碼

(2) 自定義退出狀態碼,其格式為:

return 從函式中返回,用最後狀態命令決定返回值

return 0 無錯誤返回

return 1-255 有錯誤返回

使用函式檔案

可以將經常使用的函式存入函式檔案,然後將函式檔案載入shell

檔名可任意選取,但最好與相關任務有某種聯絡。例如:functions.main

一旦函式檔案載入shell,就可以在命令列或指令碼中呼叫函式。可以使用set命令檢視所有定義的函式,其輸出列表包括已經載入shell的所有函式

若要改動函式,首先用unset命令從shell中刪除函式。改動完畢後,再重新載入此檔案

刪除shell函式

現在對函式做一些改動後,需要先刪除函式,使其對shell不可用。使用unset命令完成刪除函式

命令格式為:

函式可以接受引數:

傳遞引數給函式:呼叫函式時,在函式名後面以空白分隔給定引數列表即可;例如「testfunc arg1 arg2 ...」

在函式體中當中,可使用$1, $2, ...呼叫這些引數;還可以使用$@, $*, $#等特殊變數

函式遞迴:

函式直接或間接呼叫自身

注意遞迴層數

訊號捕捉trap

trap '觸發指令' 訊號

程序收到系統發出的指定訊號後,將執行自定義指令,而不會執行原操作

trap '' 訊號

忽略訊號的操作

trap '-' 訊號

恢復原訊號的操作

trap -p

列出自定義訊號操作

trap finish exit

當指令碼退出時,執行finish函式

陣列變數:儲存單個元素的記憶體空間

陣列:儲存多個元素的連續的記憶體空間,相當於多個變數的集合

陣列名和索引

索引:編號從0開始,屬於數值索引

注意:索引可支援使用自定義的格式,而不僅是數值格式,即為關聯索引,bash4.0版本之後開始支援

bash的陣列支援稀疏格式(索引不連續)

宣告陣列:

declare -a array_name

declare -a array_name 關聯陣列

注意:兩者不可相互轉換

陣列賦值

陣列元素的賦值

對所有的下標賦值

shell指令碼高階

接著上篇部落格,今天整理一下關於條件測試和條件語句方面的知識。在編寫shell指令碼時,經常需要對一些條件進行判斷,可以使用測試命令test輔助完成測試過程。test命令測試特定的表示式是否成立,當條件成立時,命令執行後的返回值為0,否則為其他數值。條件測試的基本格式有 格式1 test expre...

shell指令碼程式設計高階(一)

可以巢狀 分支if 判斷條件 then 條件為真的分支 fiif 判斷條件 then 條件為真的分支 else 條件為假的分支 fiif 判斷條件1 then 條件1為真的分支 elif 判斷條件2 then 條件2為真的分支 elif 判斷條件3 then 條件3為真的分支 else 以上條件都為...

Shell指令碼 程式設計高階03

1 每隔 3 秒鐘到系統上獲取已經登入的使用者的資訊 如果發現使用者 hacker 登入,則將登入時間和主機記錄於日誌 var log login.log 中,並退出指令碼 bin bash while do echo date f t no information if who grep hack...