##1.建立函數 函數的本質就是一個準備好了的代碼塊,有兩種方式能夠建立函數:shell
function name { commands }
name() { commands }
####1.使用函數 例子:編程
#!/bin/bash #using a function in a script # function func1 { echo "This is an example of a function" } # count=1 while [ $count -le 5 ] do func1 count=$[ $count + 1 ] done # echo "This is the end of the loop" func1 echo "Now is the end of the script" #
####2.返回值(以及使用return命令)數組
#!/bin/bash # func1() { echo "Tring to display a non-exitent file" ls -l badfile } # echo "testing the function:" func1 echo "The exit status is: $?" #使用$?得到返回值 #這裏將返回2,由於ls 失敗 # #若是將函數內命令的次序交換 func1() { ls -l badfile echo "Tring to display a non-exitent file" } #腳本最後將返回0,由於echo執行成功
使用return命令容許指定一個整數來定義返回值,但要注意:bash
####3.使用函數進行輸出 命令的輸出能夠保存到shell,函數的輸出也能夠保存到shell編程語言
#!/bin/bash #using the return command in a function # function dbl { read -p "Enter a value " value echo $[ $value * 2 ] #整數運算 } # result=$(dbl) #獲取輸出 echo "The new value is $result"
##2.在函數中使用變量和數組 ####1.使用變量ide
#!/bin/bash #passing parameter to a function #一個簡單的例子 function addem { if [ $# -eq 0 ] || [ $# -gt 2 ] then echo -1 elif [ $# -eq 1 ] then echo $[ $1 + $1 ] else echo $[ $1 + $2 ] fi } # echo -n "Adding 10 and 15: " value=$(addem 10 15) echo $value echo echo -n "Let's try adding just one number:" value=$(addem 10) echo $value echo echo -n "Now trying adding no numbers:" value=$(addem) echo $value echo echo -n "Finally,try adding three numbers:" value=$(addem) echo $value
#!/bin/bash #trying to access script parameters inside a function # function func7 { echo $[ $1 * $2 ] } # if [ $# -eq 2 ] then value=$(func7 $1 $2) #手動傳過去 echo "The result is $value" else echo "Usage: badtest1 a b" fi
####2.在函數中處理變量 函數中有兩種變量,全局變量和局部變量函數
#!/bin/bash #demonstrating the local keyword # function func1 { local temp=$[ $value +5 ] #聲明成局部變量 result=$[ $temp * 2 ] } # temp=4 #外面的這個變量與函數裏面的同名變量會被區分開來 value=6 # func1 echo "The result is $result" if [ $temp -gt $result ] then echo "temp is larger" else echo "temp is smaller" fi
####3.在函數中處理數組變量 在函數中若是試圖把數組變量當成函數參數的話,函數只會取第一個值。因此,咱們須要將數組打散,而後再從新組合起來。oop
#!/bin/bash #adding values in an array # function addarray { local sum=0 local newattay newarray=($(echo "$@")) for value in ${newarray[*]} do sum=$[ $sum + $value ] done echo $sum } # myarray=(1 2 3 4 5 6) echo "The original array is: ${myarray[*]}" arg1=$(echo ${myarray[*]}) #利用echo將數組一個個輸出 result=$(addarray $arg1) echo "The result is $result"
從函數返回數組也是同樣的命令行
#!/bin/bash #returning an array value # function arraydblr { local origarray local newarray local elements local i origarray=($(echo "$@")) newarray=($(echo "$@")) elements=$[ $# - 1 ] #這個for的用法頗有價值,科學運算裏,仍是處理數組比較多 for ((i = 0; i <= $elements; i++)) { newarray[$i]=$[ ${origarray[$i]} * 2 ] } echo ${newarray[*]} } # myarray=(1 2 3 4 5 6) echo "The origiarray is: ${myarray[*]}" arg1=$(echo ${myarray[*]}) result=($(arraydblr $arg1)) echo "The new array is: ${result[*]}" #打代碼要集中精力,我這裏報錯了好多,由於我有時拼對了,有時拼錯變量名……
####4.函數的遞歸 這個就是說,函數能夠調用本身來獲得結果code
#!/bin/bash #階乘函數,但處理的值不能太大 # function factorial { if [ $1 -eq 1 ] then echo 1 else local temp=$[ $1 -1 ] local result=$(factorial $temp) #函數調用本身 echo $[ $result * $1 ] fi } # read -p "Enter value: " value result=$(factorial $value) echo "The factorial of $value is: $result" #這種代碼,當心無限循環
##3.建立庫(source命令) 經過建立函數庫,能夠在不一樣腳本中引用函數,極大的減小了工做量。
source命令能夠使庫在當前shell下使用,它有個快捷方式那就是 .
#!/bin/bash #這個腳本 #假定myfuncs與腳本在同一個目錄下,若是不是,要有相應的路徑。 . ./myfuncs #注意點與點之間有一個空格 # value1=10 value2=5 # echo "The two numbers are 10 and 5" # result1=$(addem $value1 $value2) result2=$(multem $value1 $value2) result3=$(divem $value1 $value2) # echo echo "The result of adding them is: $result1" echo "The result of multiplaying them is: $result2" echo "The result of dividing them is: $result3"
##4.在命令行上使用函數
要是不當心覆蓋了原函數就很糟糕了。太危險了,就很少講了。
#將如下代碼加入到.bashrc中 # if [ -r /etc/bashrc ]; then . /etc/bashrc #注意空格 fi # . /home/rich/libraries/myfuncs #本身的庫的路徑,注意空格 #這樣,shell就能夠直接使用定義好的函數了
##5.shtool函數庫 下載地址:ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz 安裝方式: 解壓縮到home中,進入shtool文件夾,運行:
./configure #檢查構建shtool庫文件所必須的軟件 make #構建庫文件 make test #檢測 sudo make install #安裝
函數的部分列表,見書p376
使用的例子:
#!/bin/bash # shtool platform #返回平臺號,個人是Ubuntu 16.04 (AMD)