国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

第10章 函數

2019-11-08 18:22:09
字體:
來源:轉載
供稿:網友

1.     定義和使用函數

定義函數的格式:

name ()

{

   command-list;

}

調用函數的格式:

name  #省略括號

2.     檢查函數定義和取消函數定義

查看到所聲明的函數定義:

 declare –f name

 

取消定義的函數,可以使用unset命令:

unset name

3.     參數和返回數據

案例:

#!/bin/bash#定義函數PRintMsg用來輸出信息到終端屏幕,該函數至少需要兩個參數printMsg(){      #如果參數個數小于兩個,打印錯誤信息并且退出狀態為1 if [ $# -lt 2 ] then       echo "printMsg() need 2 or more arguments..."#使用return語句退出函數的執行,并制定退出狀態return 1 fi  #保存第一個參數值 PREFIX="$1"  #在參數列表中去除第一個參數 shift  #以參數1、參數2、參數3、參數4的形式打印出參數列表 echo "$PREFIX:$@" #函數執行到這里會以最后一個命令的退出狀態退出}#定義函數logMsg用來記錄信息到log文件,該函數至少可以接收一個參數logMsg(){      #判斷是否制定了參數的另一種方式,查看第一個參數是否為空 if [ -n "$1" ] then        #如果參數不為空,把日期和參數列表輸出到log文件中echo "`date` $@" >> ./arguments.log else             #如果參數為空,輸出錯誤信息并讓函數以退出狀態1返回            echo "logMsg() needs some arguments."             return 1  fi}#通過兩個參數調用函數printMsg,如果函數以非零值退出,才會調用logMsg函數#由于指定了足夠的參數,printMsg函數會返回成功值0,所以logMsg不會被調用printMsg "From printMsg()" "it works..." "aabbcc" && logMsg "From logMsg()" "it works...."

注意:

  1 如果定義的函數名與bash內建的命令相同,則這個函數會覆蓋內建命令。

4.     變量的作用域

本地變量:在函數內部所定義的變量只能在函數內部使用。變量前加了local。

全局變量:可以在腳本內任何地方使用。

 

解讀:為了程序不混亂,盡量使用本地變量,命名更具有描述性。

5.     遞歸調用

遞歸調用:函數調用本身。

案例:

#!/bin/bash#定義計算階乘的函數recursive,它接收一個參數recursive(){      #如果指定的參數為數字1,則直接返回結果1 if [ $1 - eq 1 ] then       echo "1"    #函數以狀態0返回  return 0 fi  #定義本地變量TEMP,其中保存了參數值減1后的值 local TEMP=`expr $1 -1` #在recursive的函數體內遞歸調用函數recursive本身 #指定變量TEMP作為調用函數的參數 #使用命令替換的方式調用函數,就像執行一個普通命令一樣 local PREVIOUS=`recursive $TEMP`  #把數值($1減1)的階乘計算結果和參數值$1相乘 #特殊字符星號*需要被引用,才能正確地傳遞給expr命令 RESULT=`expr $1 /* $PREVIOUS`  #輸出數值$1的階乘計算結果 echo $RESULT  #退出狀態0表示計算成功 return 0}#提示用戶輸入整數值做階乘運算,數值小于20是為了防止計算結果超出變量存儲范圍echo echo -n " Enter a number (<20) to do n! Operation (type "quit" to exit): "read INPUT#當用戶輸入字符串quit時,until循環結束,腳本退出until [ "$INPUT" = "quit" ]do       #對輸入數據進行匹配 case $INPUT in  #合法的輸入可以是1到9的個位數,或者是10到19的兩位數,還可以是20 [1-9]|[1][0-9]|20)        #調用遞歸函數并保存計算結果OUTCOME=`recursive "$INPUT"`echo "  After computing,$INPUT!=$OUTCOME"echo;;  #對所有不合法的輸入進行匹配 *)       echoecho " Not a valid number,Enter again!";; esac  #為下一次階乘運算讀取用戶輸入的數據 echo -n " Enter a number(<20) to do n!operation (type "quit" to exit):"       read INPUTdoneecho echo " Bye."exit 0

6.     函數庫

函數庫:指的是將通用的函數先定義好一個腳本,方便其他腳本調用。

 

注意:

 1 不要以#!/bin/bash開始庫文件,同時給庫文件添加可執行權限

 2 要在腳本文件的一開始執行庫文件

 

案例:

庫文件:   

#!/bin/echo       Warning:this is a library which should be sourced!#上面一行的作用是防止庫文件被意外執行#定義函數test_platform用來測試當前的操作系統test_platform(){      #在本地變量osname中保存當前的操作系統 local osname=`uname -s`  #定義全局變量PLATFORM,并初始化為UNKOWN PLATFORM=UNKNOWN  #根據當前的操作系統指定變量PLATFORM的值 case ${osname} in       "FreeBSD" in         PLATFORM="FREEBSD"       ;;"SunOS"         PLATFORM="SUNOS"       ;;"linux"         PLATFORM="LINUX"       ;; esac  return 0}

 腳本:

#!/bin/bash#首先在腳本程序中包含進庫文件library.lib從而可以調用其中定義的函數source ./library.lib #調用函數庫中的函數test_platformtest_platform#輸出函數test_platform中定義的全局變量PLATFORMechoecho "Our running platform is $PLATFORM"exit 0

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 芦山县| 体育| 昌都县| 蓬莱市| 灵寿县| 拉孜县| 深水埗区| 中江县| 探索| 商城县| 武功县| 巴里| 丹阳市| 新建县| 台中市| 临高县| 太仆寺旗| 静乐县| 眉山市| 银川市| 东台市| 葵青区| 额尔古纳市| 晋州市| 抚顺市| 左权县| 金溪县| 双峰县| 南漳县| 项城市| 天长市| 秭归县| 嘉兴市| 博客| 洮南市| 重庆市| 肇东市| 溧水县| 西丰县| 临潭县| 达拉特旗|