1. 程式人生 > >shell函式、Script檢查、迴圈結構

shell函式、Script檢查、迴圈結構

6、函式 語法格式: function func-name() { 語句組 }

任務:輸入one,輸出Today is Monday,輸入two,輸出Today is Tuesday……

1)編輯指令碼:vim func01.sh #!/bin/bash

function print() { echo “Today is $1” } case $1 in “one”) print “Monday” ;; “two”) print “Tuesday” ;; “three”) print “Wednesday” ;; “four”) print “Thursday” ;; “five”) print “Friday” ;; “six”) print “Saturday” ;; “seven”) print “Sunday” ;; *) echo “You must input a number between one and seven.” esac

在這裡插入圖片描述 在這裡插入圖片描述 2)設定許可權:chmod u+x func01.sh 在這裡插入圖片描述

3)執行指令碼 在這裡插入圖片描述

課堂練習:編寫計算圓面積的函式並呼叫。

圓周率3.14是實數,要考慮腳本里如何處理實數的計算。 1)編輯指令碼:vim func02.sh #!/bin/bash

function circle_area() { s=echo "scale=2; 3.14*$1*$1" |bc }

read -p “r=” r circle_area recho"s=r echo "s=s" 在這裡插入圖片描述 2)設定許可權:chmod u+x func02.sh 在這裡插入圖片描述

3)執行指令碼

在這裡插入圖片描述 補充:如何獲取函式的返回值?

函式體利用return語句返回函式值,但是隻能是整數。

呼叫函式後,利用 $? 可以獲取函式的返回值。

課堂練習:編寫符號函式sign(),輸入正整數,返回1,輸入零,返回0,輸入負整數,返回-1。

#!/bin/bash

function sign() { if [ $1 -gt 0 ]; then return 1 else if [ $1 -eq 0 ]; then return 0 else return – -1 fi fi }

read -p “num=” num sign $num echo $? 在這裡插入圖片描述

2)設定許可權:chmod 765 func03.sh 在這裡插入圖片描述

3)執行指令碼:./func03.sh 在這裡插入圖片描述

說明:符號位元組型的-1對映到無符號位元組型的255,符號位元組型的-2對映到無符號位元組型的254,以此類推。

7、Script檢查 (1)命令格式 sh [-nvx] scripts.sh (2)選項與引數 -n:(non-execution)不執行script,僅查詢語法的問題; -v:(verbose)在執行scripts.sh前,先將scripts.sh的內容輸出到螢幕上; -x:(executed)將使用到的scripts.sh內容顯示到螢幕上,這是很有用的引數; !!!

任務1:測試func02.sh是否有語法問題。

沒有任何輸出,表明指令碼語法沒有問題。

在這裡插入圖片描述

再次檢查指令碼func02.sh的語法有沒有問題: 在這裡插入圖片描述 可以看出,指令碼執行出錯,但是sh -n卻無法檢查出這個錯誤。

再次修改func02.sh在這裡插入圖片描述 再次檢查指令碼func02.sh的語法有沒有問題: 在這裡插入圖片描述

sh -n確實能夠捕獲這種型別的語法錯誤。

任務2:執行func03.sh之前輸出指令碼內容。 在這裡插入圖片描述

8、迴圈結構 (1)條件迴圈

第一種條件迴圈:當型迴圈 while [ 條件 ]; do 命令組 done

執行情況:條件為真,執行迴圈,直到條件為假,結束迴圈。

任務1、每個兩秒顯示系統負載監測結果。

#!/bin/bash

while true do uptime sleep 2 done 在這裡插入圖片描述

永真迴圈是個死迴圈。

2)設定許可權:chmod u+x while01.sh

在這裡插入圖片描述

3)執行指令碼:./while01.sh 在這裡插入圖片描述

怎麼結束這個死迴圈呢?很簡單,按Ctrl+C即可。

任務2、計算1+2+3+……+100 1)編輯指令碼:vim sum.sh #!/bin/bash

i=1 sum=0 while [ ile100]dosum=i -le 100 ] do sum=((sum+sum+i)) i=((((i+1)) done echo “1+2+…+100=$sum”

在這裡插入圖片描述 2)設定許可權:chmod u+x sum.sh

在這裡插入圖片描述 3)執行指令碼:./sum.sh 在這裡插入圖片描述

第二種條件迴圈:直到型迴圈 until [ 條件 ]; do 命令組 done

執行情況:條件為假,執行迴圈,直到條件為真,結束迴圈。

任務:計算1+2+3+……+100

#!/bin/bash

i=1 sum=0

until [ igt100]dosum=i -gt 100 ] do sum=((sum+sum+i)) i=((((i+1)) done

echo “1+2+…+100=$sum” 在這裡插入圖片描述

2)設定許可權:chmod u+x sum02.sh 在這裡插入圖片描述

3)執行指令碼:./sum02.sh 在這裡插入圖片描述

(2)計數迴圈 for … do [語句組] done

任務:計算1+2+……+100

1)編寫指令碼:vim sum03.sh #!/bin/bash

sum=0 for i in seq -s " " 1 1 100 # start,step,stop do sum=((((sum+$i)) done

echo “1+2+…+100=$sum” 在這裡插入圖片描述 2)設定許可權:chmod u+x sum03.sh 在這裡插入圖片描述

3)執行指令碼:./sum03.sh

在這裡插入圖片描述