BashShell建立函數

##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命令)數組

  • bashshell會把函數當成一個小型腳本,故而有返回值
  • 默認狀況下,函數的狀態碼是最後一條命令的返回的退出碼
#!/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

  1. 函數一結束就要取返回值
  2. 退出碼必須是0-255之間

####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

  • 在腳本中指定函數時,參數和函數要在同一行:func1 $value1 10
#!/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.在函數中處理變量 函數中有兩種變量,全局變量和局部變量函數

  • 默認狀況下是全局變量,對整個腳本都適用,但這有時會有麻煩
  • 在函數內的變量前叫上local就能夠將變量聲明稱局部變量,只在函數內使用
#!/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.在命令行上使用函數

要是不當心覆蓋了原函數就很糟糕了。太危險了,就很少講了。

  • 在shell中直接讀取函數文件,直接使用函數
#將如下代碼加入到.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)
相關文章
相關標籤/搜索