Linux命令行與Shell腳本編程大全-創(chuàng)建函數(shù)

本章內(nèi)容:

  • 基本的腳本函數(shù)
  • 返回值
  • 在函數(shù)中使用變量
  • 數(shù)組變量和函數(shù)
  • 函數(shù)遞歸
  • 創(chuàng)建庫
  • 在命令行中使用函數(shù)
創(chuàng)建函數(shù)

有兩種格式可以用來在bash shell腳本中創(chuàng)建函數(shù)。第一種格式是采用關(guān)鍵字function,后跟分配給該代碼塊的函數(shù)名:

function name {
   command
}

另一種格式:函數(shù)名后的圓括號為空惧眠,表明正在定義的是一個函數(shù)于个。

name() {
  command
}
使用函數(shù)
#!/bin/bash
# using a function in a script

function func1{
  echo "This is a 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 this is the end of the script"

返回值

bash shell 會把函數(shù)當(dāng)做小型腳本厅篓,運(yùn)行結(jié)束時會返回一個退出狀態(tài)碼,有3種不同的方法來為函數(shù)生成退出狀態(tài)碼或链。
第一種方式:利用標(biāo)準(zhǔn)的$?來決定函數(shù)的退出狀態(tài)碼档押,備注:$?變量會返回執(zhí)行的最后一條命令的退出狀態(tài)碼,必須得緊跟在后面

#!/bin/bash
# testing the exit status of a function
func1() {
  echo "trying to display a non-existent file"
  ls -l badfile
}

echo "testing the function:"
func1
echo "The exit status is : $?"

第二種方式:使用return命令 備注:退出狀態(tài)碼必須小于256叼耙,任何大于256的值都會返回一個錯誤值

#!/bin/bash
#using the return command in a function

function db1 {
  read -p "Enter a value: " value
  echo "doubling the value"
  return $[ $value * 2 ]
}

db1
echo "The new value is $?"

$./test5
Enter a vlaue:200
doubling the value
The  new value is 1
$

第三種方式:使用函數(shù)輸出
正如同可以將命令的輸出保存到shell變量中一樣筛婉,也可以將函數(shù)的輸出保存到shell變量中革娄∶岬可以用這種技術(shù)來獲得任何類型的函數(shù)輸出安寺,并將其保存到變量中去:

result= `db1` 

這個命令會將db1函數(shù)的輸出賦值給$result這個變量。

#!/bin/bash
#using the echo ri return a value

function db1 {
  read -p "Enter a value: " value
  echo $[ $value * 20 ]
}

result=`db1`
echo "The new value is $result"

$./tetst5
Enter a value: 200
The new value is 400
$
$./test5
Enter a value: 2000
The new value is 4000
$
向函數(shù)傳遞參數(shù)
#!/bin/bash
#passing parameters 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 -n "Let's try adding just one number: "
value=`addem 10`
echo $value
echo -n "Now trying adding no number: "
value=`addem`
echo $value
echo -n "Finally, try adding tree number: "
value=`addem 10 20 30`
echo $value

$./test6
Adding 10 and 15: 25
Let's try adding just one number: 20
Now trying adding no number: -1
Finally, try adding tree number: -1
$

由于函數(shù)使用特殊參數(shù)環(huán)境變量作為自己的參數(shù)值,它不能直接從腳本的命令行獲取傳遞給腳本的參數(shù)值迎捺。必須在調(diào)用函數(shù)是手動將它們傳過去。

#!/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 "The Usage: badtest1 a b"
fi
$
$./test7
The Usage: badtest1 a b
$./test7 10 15
The result is 150
$
在函數(shù)中處理變量

函數(shù)會用兩種類型的變量:

  • 全局變量
  • 局部變量
    全局變量是在shell腳本中任何地方都有效的變量抄沮。如果你在函數(shù)中定義了一個全局變量叛买,你可以在腳本的主體部分讀取它的值。默認(rèn)情況下刻伊,你在腳本中定義的任何變量都是全局變量椒功。在函數(shù)外定義的變量可以在函數(shù)內(nèi)正常訪問:
#!/bin/bash
#using a global variable to pass a value
function db1 {
   value=$[ $value * 2 ]
}

read -p "Enter a value: " value
db1
echo "The new value is:$value"

#$value 變量是在函數(shù)外定義的动漾,并在函數(shù)外被賦值了。當(dāng)db1函數(shù)被調(diào)用時悦屏,變量及其值在函數(shù)中依然有效键思。如果變量在函數(shù)中被賦予了新的值,那么在腳本中引用該變量是看蚜,新值依然有效赔桌。
#!/bin/bash
#demonstrating a bad use of variables

function func1 {
  temp=$[ $value + 5 ]
  result=$[ $temp * 2 ]
}

temp=4
value=6

func1
echo "The result is $result"
if [ $temp -gt $value ]
then
  echo "temp is larger"
else
  echo "temp is smaller"
fi

$./badtest2
The result is 22
temp is larger
$

#由于$temp變量在函數(shù)中用到了疾党,它的值在腳本中使用,產(chǎn)生了一個意想不到的結(jié)果竭钝。此時如果需要避免這個問題雹洗,得需要使用局部變量

局部變量在函數(shù)內(nèi)部使用的任何變量都可以被聲明稱局部變量,只要在變量聲明的前面加上local關(guān)鍵字就可以了:

local temp
#local 關(guān)鍵字保證了變量只局限在該函數(shù)中庇茫。如果腳本中在該函數(shù)之外有同樣名稱的變量旦签,那么shell將會保持這兩個變量的值是分離的。那么你就能很輕松地讓函數(shù)變量和腳本變量分離開來咪惠,只共用想共用的:
#!/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 $value ]
then
  echo "temp is larger"
else
  echo "temp is smaller"
fi
$
$./test9
The result is 22
temp is smaller
$
#現(xiàn)在在func1函數(shù)中使用$temp變量時淋淀,并不影響在主體腳本中賦給$temp變量的值
數(shù)組變量和函數(shù)
  • 向函數(shù)傳數(shù)組參數(shù)
#!/bin/bash
#tring to pass an array variable
function testit {
  echo "The parameters are: $@"
  thisarray=$1
  echo "The received array is ${thisarray[*]}
}

myarray=(1 2 3 4 5)
echo "The original array is : ${myarray[*]}"
testit  $myarray

$./badtest3
The original arry is: 1 2 3 4 5
The parameters are: 1
./badtest3: thisarray[*]: bad array subscript
The received array is
$
#如果你試圖將該數(shù)組當(dāng)成一個函數(shù)參數(shù)朵纷,函數(shù)只會取數(shù)組變量的第一個值。

解決的方法鞋仍,你可以將所有的參數(shù)重組到新的數(shù)組變量中

#!/bin/bash
# array variable to function test

function testit {
  local newarray
  newarray=(`echo $@`)
  echo "The new array value is: ${newarray[*]}"
}

myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}

$./test10
The original array is 1 2 3 4 5
The new array is 1 2 3 4 5
$
  • 從函數(shù)返回數(shù)組
#!/bin/bash
#returning an array value

function arrayblr {
  local origarray
  local newarray
  local elements
  local i
  origarray=(`echo $@`)
  newarray=(`echo $@`)
  elements=$( $# - 1 )
  for (( i=0; i <= $elements; i++ ))
  {
    newarray[$i]=$[ ${origarray[$i] * 2} ]
  }
  echo ${newarray[*]}  
}

myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
arg1=`echo ${myarray[*]}`
result=(`echo $arg1`)
echo "The newarray is $result[*]"

$
$./test12
The original array is: 1 2 3 4 5
The new array is: 2 4 6 8 10

  • 函數(shù)遞歸
#!/bin/bash
#using recursion

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 a value: " value
result=`factorial $value`
echo "The factorial of $value is: $result"
  • 創(chuàng)建庫
#my script functions

function addem {
  echo $[ $1 + $2 ]
}


function multem {
  echo $[ $1 * $2 ]
}



#!/bin/bash
#using a library file 
source ./myfuncs
#. ./myfuncs source的快捷別名威创, 點操作符

value1=10
value2=5
result1=`addem $value1 $value2`
result2=`multem $value1 $value2`
echo "The result of addem them is: $result1"
echo "The result of multem them is: $result2"

$./test14
The result of addem them is: 15
The result of multem them is: 50
$
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肚豺,一起剝皮案震驚了整個濱河市吸申,隨后出現(xiàn)的幾起案子享甸,更是在濱河造成了極大的恐慌,老刑警劉巖日丹,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聚凹,死亡現(xiàn)場離奇詭異齐帚,居然都是意外死亡彼哼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門摩瞎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孝常,“玉大人,你說我怎么就攤上這事上渴∠舶洌” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寂拆。 經(jīng)常有香客問我,道長恃慧,這世上最難降的妖魔是什么渺蒿? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任茂装,我火速辦了婚禮,結(jié)果婚禮上城侧,老公的妹妹穿的比我還像新娘彼妻。我一直安慰自己侨歉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布炮温。 她就那樣靜靜地躺著牵舵,像睡著了一般倦挂。 火紅的嫁衣襯著肌膚如雪方援。 梳的紋絲不亂的頭發(fā)上涛癌,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天祖很,我揣著相機(jī)與錄音,去河邊找鬼胚鸯。 笑死笨鸡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哥桥。 我是一名探鬼主播激涤,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼倦踢,長吁一口氣:“原來是場噩夢啊……” “哼辱挥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起褂微,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤园爷,失蹤者是張志新(化名)和其女友劉穎腮介,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叠洗,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡灭抑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年腾节,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庆冕。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡访递,死狀恐怖同辣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情响巢,我是刑警寧澤棒妨,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布踪古,位于F島的核電站,受9級特大地震影響券腔,放射性物質(zhì)發(fā)生泄漏灾炭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一颅眶、第九天 我趴在偏房一處隱蔽的房頂上張望蜈出。 院中可真熱鬧,春花似錦涛酗、人聲如沸铡原。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燕刻。三九已至剖笙,卻和暖如春卵洗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工过蹂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留十绑,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓酷勺,卻偏偏與公主長得像本橙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脆诉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容