麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Linux Shell > 正文

Shell中的函數、函數定義、作用域問題介紹

2020-07-27 19:12:25
字體:
來源:轉載
供稿:網友

說起函數調用,相信大家也不會陌生,然而對于初學Shell的我來說,Shell中函數調用方式卻有點讓我不太習慣,自己也走了不少的彎路,因為傳遞參數時出了一個很“自然”的錯誤,也讓我吃了不少的苦頭,所以總結一下Shell中函數的調用方法。

一、Shell中函數的定義

為了方便程序和管理和模塊化并減少代碼的重復,函數的確是一個好東西。而Shell中函數的定義有兩種方法,如下:

復制代碼 代碼如下:

function fname()
{
    statements;
}


復制代碼 代碼如下:

fname()
{
    statements;
}

注意,()內是沒有參數的,它并不像C語言那樣,在()里可以有參數。

那大家可能就郁悶了,函數調用或多或少總是會需要一些參數,那么這些參數要怎么傳遞進來呢?其實參數傳遞方式為:fname;(不需要傳遞參數)或fname agr1 arg2(需要傳遞兩個參數);

二、自定義函數的例子

不知道大家的情況如何,反正一開始我就覺得很別扭,因為在C語言中,例如我定義一個函數int cmp(int a, int b),那么我就會在函數中使用到函數頭中聲明的變量a和b,而在Shell中卻沒有定義參數,那我的函數又需要用到這兩個參數,怎么辦好呢?下面就用一個例子來說明好了。

復制代碼 代碼如下:

#! /bin/bash 
# Filename:LoopPrint.sh 
 
function LoopPrint() 

    count=0; 
    while [ $count -lt $1 ]; 
    do 
    echo $count; 
    let ++count; 
    sleep 1; 
    done 
    return 0; 

 
read -p "Please input the times of print you want: " n; 
LoopPrint $n; 

先來說說這個程序的功能吧,就是輸入一個數字n,然后從0開始每隔1秒輸入一個數字,直到輸出n-1為止。首先,程序會要求你輸入一個數學,然后調用函數來進行輸出的功能。

注意注釋1的那一句,里面有一個變量$1,大家應該還記得調用函數時參數的傳遞方式,即fname agr1 arg2,這里的$1就是表示第一個參數,依此類推,$2就是第二個參數,$3就是第3個參數,$n就是表示第n個參數。

所以$1就是變量n的值。這樣說大家懂了吧!

補充一下,就是:

$0:是腳本本身的名字;
$#:是傳給腳本的參數個數;
$@:是傳給腳本的所有參數的列表,即被擴展為"$1" "$2" "$3"等;
$*:是以一個單字符串顯示所有向腳本傳遞的參數,與位置變量不同,參數可超過9個,即被擴展成"$1c$2c$3",其中c是IFS的第一個字符;
$$:是腳本運行的當前進程ID號;
$?:是顯示最后命令的退出狀態,0表示沒有錯誤,其他表示有錯誤;

特別注意,傳遞參數時,(這個例子中)一定要寫成LoopPrint $n;而不能寫成LoopPrint n。為什么?例如你輸入的是20,則n的值($n)為20,前者表示的是把n的值,即20傳遞給函數LoopPrint,而后者則表示把字符n傳遞給函數LoopPrint。這點與在靜態語言中的函數參數傳遞是很不同的,因為在Shell中變量的使用并不需要先定義,所以要使用變量,讓Shell知道它是一個變量,并要傳遞它的值時,就是用$n,而不能直接用n,否則只把n當作一個字符來處理,而不是一個變量。

三、作用域問題

函數的作用域與C/C++語言中的作用約束是一樣的,函數的定義一定要出現在函數的調用語句之前,但是有一點跟C/C++中不一樣的就是變量的作用域問題,經過本人的試驗,在注釋1的語句改為while [ $count -lt $n ];也是可行的,即函數可以使用本文件中出現的任何變量,但是本人還是建議使用上面例子中的方法,即while [ $count -lt $1 ],并且不要隨意使用函數中的變量之外的變量,因為你并不一定知道你調用函數時函數外有什么變量存在也不知道它的值是什么,也不能保證別人在使用你的函數時會傳遞你在函數中使用到的變量名,如這里的n,別人在使用時可能傳遞的就是他自己定義的變量,如Count等。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 青青草国产在线视频 | free台湾极品性hd | 羞羞答答tv | 成人aaaa免费全部观看 | 久久新网址| 亚洲一区久久 | 超碰人人做人人爱 | 轻点插视频 | 国产深夜福利视频在线播放 | 日韩1区 | 黄色网页在线观看 | 一区二区三区视频在线 | 一级做a爱片毛片免费 | 91成人影库 | 暖暖免费观看高清完整版电影 | 18一20岁一级毛片 | 午夜影院在线免费观看 | 狠狠干五月天 | 一级黄色淫片 | 龙的两根好大拔不出去h | 久久看视频 | 中文字幕1区2区 | 舌头伸进添的我好爽高潮网站 | 天天操天天碰 | 精品国产视频一区二区三区 | 天天都色| 在线观看国产一区二区三区 | 日本不卡视频在线观看 | 中文字幕在线观看国产 | 亚洲草逼视频 | 超碰97最新 | 成人三级电影网站 | 电影一级毛片 | 色呦呦一区二区三区 | 欧美日韩亚洲成人 | 又黄又爽免费无遮挡在线观看 | 特片网久久| avlululu| 色偷偷欧美 | 中文字幕一区在线观看视频 | 逼特逼视频在线观看 |