Linux Shell函式呼叫簡要介紹

2021-06-26 03:05:06 字數 1848 閱讀 4853

初學shell的我來說,shell函式定義和我們以前的學習的函式的意義是一樣的但是在使用方法和函式的呼叫方面有些不一致,因此在學習的shell script的函式的需要了解不同點,不管是c語言還是在shell中函式的可以簡化我們的程式,提高編寫程式的效率。

本文中主要的介紹shell函式的特點,希望能夠很快的掌握裡linux shell函式。

一、shell中函式的定義

為了方便程式和管理和模組化並減少**的重複,函式的確是乙個好東西。而shell中函式的定義有兩種方法,如下:

function fname()

或fname()

注意,()內是沒有引數的,它並不像c語言那樣,在()裡可以有引數,函式的傳遞時採用呼叫時傳值。

函式呼叫或多或少總是會需要一些引數,那麼這些引數要怎麼傳遞進來呢?其實引數傳遞方式為:fname(不需要傳遞引數,後面不傳值)或fname agr1 arg2(需要傳遞兩個引數)

二、shell函式的例子

下面就用乙個例子來說明好了。

[plain]view plain

copy

print?

#! /bin/bash  

# filename:loopprint.sh  

function loopprint()  

read -p "please input the times of print you want: " n;  

loopprint $n;  

函式功能:輸入乙個數字n,然後從0開始每隔1秒輸入乙個數字,直到輸出n-1為止。首先,程式會要求你輸入乙個數學,然後呼叫函式來進行輸出的功能。

需要說明的是shell函式中的$1,這裡的$表示是呼叫函式時函式後後面的第乙個引數。例如在fname agr1 arg2,這裡的$1就是表示第乙個引數,依此類推,$2就是第二個引數,$3就是第3個引數,$n就是表示第n個引數。

二、shell函式特殊符號的含義

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

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

$@:是傳給指令碼的所有引數的列表,即被擴充套件為"$1" "$2" "$3"等;

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

$$:是指令碼執行的當前程序id號;

$?:是顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤;

特別注意,

1、傳遞引數時,(這個例子中)一定要寫成loopprint $n;而不能寫成loopprint n。為什麼?例如你輸入的是20,則n的值($n)為20,前者表示的是把n的值,即20傳遞給函式loopprint,而後者則表示把字元n傳遞給函式loopprint。

2、在靜態語言中的函式引數傳遞是很不同的,因為在shell中變數的使用並不需要先定義,所以要使用變數,讓shell知道它是乙個變數,並要傳遞它的值時,就是用$n,而不能直接用n,否則只把n當作乙個字元來處理,而不是乙個變數。

三、作用域問題

函式的作用域與c/c++語言中的作用約束是一樣的,函式的定義一定要出現在函式的呼叫語句之前,但是有一點跟c/c++中不一樣的就是變數的作用域問題,假如在注釋1的語句改為while [ $count -lt $

n ];也是可行的,即函式可以使用本檔案中出現的任何變數,但是本人還是建議使用上面例子中的方法,即while [ $count -lt $1 ],並且不要隨意使用函式中的變數之外的變數,因為你並不一定知道你呼叫函式時函式外有什麼變數存在也不知道它的值是什麼,也不能保證別人在使用你的函式時會傳遞你在函式中使用到的變數名,如這裡的n,別人在使用時可能傳遞的就是他自己定義的變數,如count等。

特別說明本文參考: 部分內容

linux shell函式定義和呼叫

說起函式呼叫,相信大家也不會陌生,然而對於初學shell的我來說,shell中函式呼叫方式卻有點讓我不太習慣,自己也走了不少的彎路,因為傳遞引數時出了乙個很 自然 的錯誤,也讓我吃了不少的苦頭,所以總結一下shell中函式的呼叫方法。一 shell中函式的定義 為了方便程式和管理和模組化並減少 的重...

Linux Shell函式定義與呼叫

shell函式定義格式,各部分說明如下 function 等中括號括起來部分 表示可選 即可有可無 your function name部分 為函式名 your shell commands部分 為函式 shell一般以行為單位,但可以使用 換行,也可以在單行內使用 作為分隔符 return int...

簡析C 函式呼叫方式

在對函式進行除錯過程中,電腦沒有辦法知道乙個函式呼叫需要多少個 什麼樣的引數,也沒有硬體可以儲存這些引數,所以這大大的提高了對函式呼叫的準缺無誤性。也就是說,計算機不知道怎麼給這個函式傳遞引數,傳遞引數的工作必須由函式呼叫者和函式本身來協調。為此,計算機提供了一種被稱為棧的資料結構來支援引數傳遞。棧...