1. 程式人生 > >Linux shell指令碼程式設計之函式

Linux shell指令碼程式設計之函式

在編寫功能比較複雜的shell指令碼時,完成具體任務的程式碼有時會被重複使用,bash shell指令碼提供函式特性實現程式碼複用,函式是被賦予名稱的指令碼程式碼塊。

一、建立函式
在bash shell指令碼中建立函式的格式如下:

function name()
{
    commands
}	
一個簡單的例子如下:
$ cat test.sh
#!/bin/bash
function func_test(){
    echo "hello world"
}
func_test;
$ ./test.sh
hello world
注意:函式要在使用前定義,使用沒有定義的函式會報錯。
二、函式的返回值
bash shell將函式看作是一個小型的指令碼,函式的退出碼(即返回值)有三種形式:
(1)預設退出狀態
與一般指令碼相同,在函式執行完後,函式的退出碼存放於變數$?中。
$ cat test.sh
#!/bin/bash
function func_test(){
    echo "hello world"
}
func_test;
echo "func_test的返回值為:$?"
$ ./test.sh
hello world
func_test的返回值為:0
可以看出函式的預設返回值為0,但是最好不要使用函式的預設返回值,看下面這個例子
$ cat test.sh
#!/bin/bash
function func_test(){
    ls -l /xxx/xxxx  #/xxx/xxxx是一個不存在的資料夾
    echo "program end"
}
func_test;
echo "func_test的返回值為:$?"
$ ./test.sh
ls: 無法訪問'/xxx/xxxx': 沒有那個檔案或目錄
program end
func_test的返回值為:0
可以看出 ls -l 命令執行失敗,但是函式返回值卻是0,因為最後一條命令echo能夠正確執行。函式的返回值是最後一條命令的返回值。我們執行func_test後,根據返回碼無法判斷ls -l命令是否執行成功,這明顯不是一個好的做法。
(2)在函式中使用return命令返回指定狀態碼
$ cat test.sh
#!/bin/bash
function func_test(){
    if ! ls -l /xxx/xxxx  #/xxx/xxxx是一個不存在的資料夾
    then 
         return 1
    fi
    echo "program end"
}
func_test;
echo "func_test的返回值為:$?"
$ ./test.sh
ls: 無法訪問'/xxx/xxxx': 沒有那個檔案或目錄
func_test的返回值為:1
ls -l 命令執行失敗,函式退出,返回碼為1。有兩點一定要注意:
1、函式的返回碼跟指令碼返回碼一樣,取值範圍為0~255
2、函式返回值在函式執行完後最好立即取出。(如果在函式後又執行了其它命令,函式的返回碼會被命令的返回碼覆蓋)

(3)函式輸出
  使用函式輸出將函式輸出存放到shell變數中,這樣我們可以從函式獲取任意型別的輸出。
$ cat test.sh
#!/bin/bash
function func_add(){
    read -p "請輸入兩個整數:" a b 
    echo $[ $a+$b ]
}
result=`func_add`;
echo "兩個數的和為:$result"
$ ./test.sh
請輸入兩個整數:100 300
兩個數的和為:400
三、向函式中傳遞引數
  與向指令碼傳遞引數相同,參見Linux shel程式設計之命令列引數處理
 這裡只給出一個簡單例子:
$ cat test.sh
#!/bin/bash
function func_add(){
    echo $[ $1+$2 ]
}
read -p "請輸入兩個整數:"  a b
result=`func_add $a $b`;
echo "兩個數的和為:$result"
$ ./test.sh
請輸入兩個整數:100 200
兩個數的和為:300

四、在函式中使用變數

變數作用域是shell指令碼程式設計師遇到的常見的問題,使用域是變數的可見區域。函式內定義的變數與普通變數有著不同的作用域。函式內可以使用兩種型別的變數:全域性變數和區域性變數
1.全域性變數
全域性變數是在shell指令碼內處處可以使用的變數,如果指令碼的主程式碼定義了全域性變數,那在函式內部可以使用這個變數的值,同樣,如果在函式內部定義了全域性變數,那在指令碼的主程式碼中也可以使用這個變數的值。預設情況下,指令碼中定義的變數都是全域性變數,使用全域性變數時應該非常小心:

$ cat test.sh
#!/bin/bash
function test_global
{
 value=$[$value*2]
 temp=$value
}

value=12
test_global
echo "value=${value}"
echo "temp=${temp}"
$ ./test.sh
value=24
temp=24
2.區域性變數
只能在函式內部使用的變數稱為區域性變數,宣告區域性變數時要在變數名前加上"local"關鍵字
$ cat test.sh
#!/bin/bash
function test_global
{
  local value=24
  echo "local value=${value}"
}

value=12
test_global
echo "global value=${value}"
$ ./test.sh
local value=24
global value=12
五、陣列變數與函式

1.陣列變數
陣列是能儲存多個值的變數,陣列中的值可以單個引用,也可以作為一個整體引用。

$ cat test.sh
#!/bin/bash
array=(1 2 3 4 5)
echo ${array}
echo ${array[2]}
echo ${array[*]}
array[2]=333
echo ${array[*]}
$ ./test.sh 
1
3
1 2 3 4 5
1 2 333 4 5
從上面例子可以看出:如果直接使用${array}只能得到第一個元素。使用${array[n]}可以根據下標索引獲取陣列中元素。如果想得到整個陣列的值就要使用echo ${array[*]},還可以直接修改陣列元素的值。

2.向函式傳遞陣列

要想把陣列變數傳遞給函式,如果把陣列變數作為單個引數傳遞,會得到意想不到的結果。

$ cat test.sh
#!/bin/bash
function test_array
{
   echo "The parameters are:[email protected]"
}

array=(1 2 3 4 5)
test_array ${array}
$ ./test.sh
The parameters are:1
顯然直接將陣列變數作為函式引數使用,那麼只能得到陣列變數的第一個元素。將陣列變數拆分為單個元素可以解決這個問題。
$ cat test.sh
#!/bin/bash
function test_array
{
   echo "The parameters are:[email protected]"
   new_array=(echo "[email protected]")
   echo "new_array: ${new_array[*]}"
   sum=0
   for val in ${new_array[*]}
   do
       sum=$[${sum}+${val}]
   done
   echo "the total of array is :${sum}"
}

array=(1 2 3 4 5)
test_array ${array[*]}
$ ./test.sh
The parameters are:1 2 3 4 5
new_array: echo 1 2 3 4 5
the total of array is :15
3.從函式返回陣列
也可以從函式向shell腳本回傳陣列變數,利用函式輸出以恰當的順序輸出各陣列的值,然後指令碼必須將這些資料重組為新陣列變數。
$ cat test.sh
#!/bin/bash
function test_array
{
  ret_array=(1 2 3 4 5)
  echo "${ret_array[*]}"
}

array="(`test_array`)"
echo "the functon return:${array[*]}"
$ ./test.sh
the functon return:(1 2 3 4 5)
六、函式庫 如果我們想在一個指令碼a呼叫另一個指令碼b定義的函式,即將指令碼檔案b當作一個函式庫使用,利用source命令可以在指令碼a內部執行指令碼b(不建立新的shell執行指令碼b),這樣在指令碼a中就可以使用指令碼b種定義的函式。所以只需要在指令碼a中加入 

source  /..../b.sh或.  /...../b.sh即可,/....../b.sh表示指令碼b的路徑

.與source在此處含義相同。

$ cat add.sh
#!/bin/bash
function add()
{
  echo $[$1+$2]
}
$ cat test.sh
#!/bin/bash
. ./add.sh
result=`add 1 2`
echo "1,2相加的和為:$result"
$ ./test.sh
1,2相加的和為:3

相關推薦

Linux shell指令碼程式設計函式

在編寫功能比較複雜的shell指令碼時,完成具體任務的程式碼有時會被重複使用,bash shell指令碼提供函式特性實現程式碼複用,函式是被賦予名稱的指令碼程式碼塊。 一、建立函式 在bash shell指令碼中建立函式的格式如下: function name() {

從新手到系統管理員(四):Linux Shell指令碼程式設計數學(Part I)

本文由 [茶話匯] – [Qing] 編譯自 [Avishek Kumar] 轉載請註明出處 這部分主要討論數學相關的shell指令碼程式設計。 加法運算 新建一個檔案“Addition.sh”,輸入下面的內容並賦予其可執行的許可權。 [code language=”bash”] #!/bin/b

Shell指令碼程式設計函式

2016/06/10 1. 指令碼中使用函式建立函式的格式,有兩種:function name {commands}或name() {commands} #!/bin/bash#using a fu

linux基礎shell指令碼程式設計3 函式陣列

本章主要寫shell有關函式陣列使用 七 函式 7.1 函式的介紹 函式function是由若干條shell命令組成的語句塊,實現程式碼重用和模組化程式設計。  它與shell程式形式上是相似的,不同的是它不是一個單獨的 程序,不能獨立執行,而是shel

Linux初級運維(十五)——bash指令碼程式設計函式

一、函式         函式:功能,function  程式碼重用的功能。         結構化程式設計,不能獨立執行,需要呼叫

Linux Shell指令碼程式設計--函式返回值

Shell函式返回值,常用的兩種方式:return,echo 1) return 語句shell函式的返回值,可以和其他語言的返回值一樣,通過return語句返回。示例: #!/bin/sh function test() { echo "arg1 =

Linux-Shell指令碼程式設計基礎(1)

1. 我們一般在使用Linux系統的時候,都活接觸到shell指令碼的使用,例如我們經常在linux系統中使用的ls命令、cd命令等,都是衣蛾簡單而又基本的shell命令,在 linux系統中我們一般的使用如下的格式來進行shell指令碼的編寫: (1)格式 #!bin/bash e

Linux Shell指令碼程式設計 --awk命令詳解

簡單使用: awk :對於檔案中一行行的獨處來執行操作 。 awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。    

Shell指令碼程式設計(一)Shell指令碼簡介

什麼是Shell指令碼 shell script 是利用 shell 的功能所寫的一個『程式 (program)』,這個程式是使用純文字檔案,將一些 shell 的語法與指令(含外部指令)寫在裡面, 搭配正則表示式、管線命令與資料流重導向等功能,以達到我們所想要的處理目的 s

Shell指令碼程式設計(三)執行方式差異(source, sh script, ./script)

利用直接方式或bash執行 該 指令碼 都會使用一個新的 bash 環境來執行指令碼內的指令!也就是說,使用這種執行方式時, 其實 script 是在子程式的 bash 內執行的 知識點 當子程式完成後,在子程式內的各項變數或動作將會結束而不會傳回到父程式中

Shell指令碼程式設計(二)簡單的Shell指令碼練習

練習題1:互動式指令碼(使用者決定變數內容) 程式碼 [[email protected] bin]$ vim showname.sh #!/bin/bash # Program: # User inputs his first name and last

Linux Shell指令碼程式設計提高(12)

實際上Shell是一個命令直譯器,它解釋由使用者輸入的命令並且把它們送到核心,不僅如此,Shell有自己的程式語言用於對命令的編輯,它允許使用者編寫由shell命令組成的程式.Shel程式語言具有普通程式語言的很多特點,比如它也有迴圈結構和分支控制結構等,用這種程式語言編寫的Shell程式與其他應用程式具有同

Linux Shell指令碼程式設計--awk命令詳解

簡單使用: awk :對於檔案中一行行的獨處來執行操作 。 awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。 詳細介紹: AWK命令介紹 awk語言的最基本功能是在檔案或字串中基於指定規則瀏覽和抽取資訊,awk抽取資訊後,才能進行其他

Linux shell指令碼程式設計-將一行中的某個部分去重

一,背景。 今天遇到了一個使用場景,獲取檔案中每一行的某個屬性資料,然後將該屬性資料去重。 二,shell指令碼編寫。 bash 1 #!/bin/bash 2 for line in `cat test1|awk -F "|"

Linux Shell 指令碼程式設計(3)—Shell輸入與輸出

shell 輸入與輸出 提綱: echo read cat 管道 tee 檔案重定向

Linux Shell指令碼程式設計--cut命令

cut cut命令可以從一個文字檔案或者文字流中提取文字列。 cut語法 [[email protected] ~]# cut -d'分隔字元' -f fields <==用於有特定分隔字元 [[email protected] ~]# cut

一文學會Linux-shell指令碼程式設計基礎

終於到shell 指令碼這章了,在以前筆者賣了好多關子說shell指令碼怎麼怎麼重要,確實shell指令碼在linux系統管理員的運維工作中非常非常重要。下面筆者就帶你正式進入shell指令碼的世界吧。 到現在為止,你明白什麼是shell指令碼嗎?如果明白最好了,不明白

Linux Shell指令碼程式設計--scp命令詳解

不同的Linux之間copy檔案常用有3種方法: 第一種就是ftp,也就是其中一臺Linux安裝ftp Server,這樣可以另外一臺使用ftp的client程式來進行檔案的copy。 第二種方法就是採用samba服務,類似Windows檔案copy 的方式來操作,比較簡潔方便。 第三種就是利用scp命令來

Linux-Shell指令碼程式設計-學習-4-Shell程式設計-運算元字-加減乘除計算

對於任何一種程式語言都很重要的特性就是運算元字的能力,遺憾的是,對於shell指令碼來說,這個過程比較麻煩,在shell指令碼中有兩種途徑來進行數學運算操作。 1.expr 最開始的時候,shell提供了一個特別的命令來梳理數學表示式,expr允許在命令列上處理數學表示式

linux-shell指令碼命令awk

[ awk用法示例: ] 1.  -F 表示以什麼作為分隔符    awk -F: '{print $1}' ccc.txt                     # 以 : 作為分隔符, 打印出ccc.txt檔案中每一行中的第一段字串    awk -F: '{print $1,$2}' cc