shell學習三十一天----函數問題

來源:互聯網
上載者:User

標籤:shell

函數

案例一:

#!/bin/bash

hello () {

        echo "hahahah"

}

hello

 

執行函數,結果為:hahaha

 

 

案例二:

#!/bin/bash

funWithReturn()

{

        echo "the function is to get the sum of two number"

        read -p "input first number" num1

        read -p "input second number" num2

        echo "the two number are $num1 and $num2 !"

        return $(( $num1+$num2 ))

}

 

funWithReturn

ret=$?

echo "sum = $ret"

 

執行函數,得到兩個數的和.

 

案例三:

#!/bin/bash

number_one() {

        echo "number_one"

        number_two

}

 

number_two()

{

        echo "number_two"

}

number_one

執行命令:[[email protected] tmp]# sh function2.sh 

輸出結果:

number_one

number_two

 

分析:定義shell函數的文法為

[funciton] funname [()]

{

action

[ return int ]

}

說明:

1.可以帶function fun()定義,也可以直接fun()定義,不帶任何參數(關鍵字function可以省略).

2.函數返回,可以顯示的加:return返回,如果不加,將以最後一條命令的運行結果作為返回值.

 

 

Shell函數類似於Shell指令碼,裡面存放了一系列的指令,不過Shell的函數存在於記憶體,而不是硬碟檔案,所以速度很快,另外,Shell還能對函數進行預先處理,所以函數的啟動比指令碼更快。

 

語句部分可以是任意的Shell命令,也可以調用其他的函數。

如果在函數中使用exit命令,可以退出整個指令碼,通常情況,函數結束之後會返回調用函數的部分繼續執行。

可以使用break語句來中斷函數的執行。

declare –f 可以顯示定義的函數清單

declare –F可以只顯示定義的函數名

unset –f 可以從Shell記憶體中刪除函數

export –f將函數輸出給Shell

另外,函數的定義可以放到.bash_profile檔案中,也可以放到使用函數的指令碼中,還可以直接放到命令列中,還可以使用內部的unset命令刪除函數。一旦使用者登出,Shell將不再保持這些函數。

 

補充一下,就是:

$0:是指令碼本身的名字;

$#:是傳給指令碼的參數個數;

[email protected]:是傳給指令碼的所有參數的列表,即被擴充為"$1" "$2" "$3"等;

$*:是以一個單字串顯示所有向指令碼傳遞的參數,與位置變數不同,參數可超過9個,即被擴充成"$1c$2c$3",其中c是IFS的第一個字元;

$$:是指令碼啟動並執行當前進程ID號;
$?:是顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤;

 

舉例說:

指令碼名稱叫test.sh 入參三個: 1 2 3

運行test.sh 1 2 3後

$*為"1 2 3"(一起被引號包住)

[email protected]為"1" "2" "3"(分別被包住)

$#為3(參數數量)

 

其中exit  是用來結束一個程式的執行的,而return只是用來從一個函數中返回。

exit(0)表示正常退出執行程式,如果加其它的數值:1,2,....可以表示由於不同的錯誤原因而退出 。 

那麼,1,2,3怎麼對應不同的原因?   --你自己想讓它是什麼意思,它就是什麼意思.

但一般都有常用的、通用的含義:比如   0   一般都表示正常返回、退出。

因此,,在main函數中exit(0)等價於return 0。

 

 

全域變數

這種類似與C語言中的全域變數(或環境變數)

案例:

#!/bin/bash

g_var=

function mytest()

{

        echo "mytest"

        echo " args $1"

        g_var=$1

 

        return 0

}

mytest 1

echo "return $?"

 

echo

echo "g_var=$g_var"

分析:主要是echo "return $?"輸出時0不好理解,這個是說上一行的mytest這個函數執行成功了,所以值為0,但是在這個函數的內部給全域變數重新賦值.所以結果為:

mytest

 args 1

return 0

 

g_var=1

 

函數沒有提供局部變數.因此所有的函數都與父指令碼共用變數;即,你必須小心留意不要修改父指令碼裡不期望改變的東西,例如:path.不過這也表示其他狀態是共用的,例如當前木與捕捉訊號.

shell學習三十一天----函數問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.