1. 程式人生 > >函式詳解(function)--shell學習

函式詳解(function)--shell學習

  • 在其他語言中,我們多次或者經常重複使用的程式碼片段,會被我們放入一個函式,然後多次引/呼叫該函式就十分方便了。shell指令碼語言也不例外。

  • 我認為,函式是程式碼自身的第一層抽象封裝。

函式:function

一、宣告函式

兩種方式宣告函式:

1.”function”不可以省略(bash)

  function find { 
  }

2.不得新增引數

  find() { 
  }

兩種宣告方式效果等價。
注意

二、呼叫函式

直接指定函式名即可。一定要注意在宣告之後才可以呼叫

  • 其實函式被呼叫時會被當作一個小指令碼來看待,呼叫時也可以在函式名後跟引數。
  • 兩種方式在呼叫時都不可以加() :
    • 這裡寫圖片描述

正確的呼叫方式:

  • 這裡寫圖片描述

我們看一下返回結果:

  • 這裡寫圖片描述

三、函式的返回值

既然把函式也當作一個小指令碼,那麼函式也有退出狀態碼咯?bingo! 函式執行結束後也會有一個退出狀態碼。可以用$?變數來顯示上一條命令/函式執行結束的退出狀態碼。退出狀態碼中,預設的常用狀態碼這裡有介紹->blog<-
當我們不想使用預設的退出狀態碼時,怎麼辦呢?當然,shell也為我們提供了return,像其他語言函式中return 一樣,不過(整形)返回值必須在0~255之間。否則將會被進行 模256的運算,除此之外return也不可以返回字串或者其他型別,那麼我們想要返回字串時怎麼辦呢?我們需要呼叫函式其他命令去使函式有輸出值。

return

我們來看一下return 的使用:

  • 函式的宣告
  • 函式的呼叫
  • 呼叫結果

那麼,我麼想要返回字串時怎麼辦呢?我們需要這樣做:捕獲函式的輸出到一個變數

函式的輸出

我們來看一下函式的輸出,函式的輸出其實是值得函式中的命令的輸出值的總和,我們來看這麼一個例子:

  • 函式: 函式體內部一共有三行程式碼

    • 這裡寫圖片描述
  • 呼叫: 分別是普通呼叫捕獲返回值呼叫

    • 這裡寫圖片描述
  • 返回值:我們用result捕獲 ` ` 中運算的結果(即函式的輸出)

    • 這裡寫圖片描述

從兩次呼叫的結果順序來看,普通呼叫按正常順序輸出,而捕獲返回值呼叫則將第1、3行的echo作為函式的輸出來對待。所以放在最後輸出。

四、在函式中使用變數

引數

函式中使用引數
在上面的例子裡我們也瞭解,函式被視為一個一個小型的指令碼看待。那麼在傳參的時候與指令碼一樣。

funName var0 var1

直接在函式名稱後跟引數即可,在引用的時候用

$1 #呼叫第一個引數
$n #呼叫第n個引數(n>0;n=0時變數為當前指令碼檔名)
$# #返回引數個數n

全域性變數

全域性變數指的是在shell指令碼中任何(定義後)地方都有效的變數,當然作為shell指令碼的配置檔案變數–環境變數,自然可以被視為全域性變數來使用。

區域性變數

區域性變數比全域性變數的作用範圍小。在函式中,作為臨時變數就沒有必要將作用域宣告那麼廣,以免引起意想不到的衝突。
宣告區域性變數的方法:(加 local)

local var0

例子:

  • 函式(區域性變數)的宣告
    • 這裡寫圖片描述
  • 函式的呼叫,全域性變數的宣告,引數的使用方法
    • 這裡寫圖片描述
  • 執行結果
    • 這裡寫圖片描述

五、建立庫

與c的標頭檔案類似,在shell中,也可以定義"庫檔案",然後再另一個檔案中匯入。庫檔案沒有特殊宣告或者定義,也是指令碼檔案.sh。

使用庫函式的關鍵在於匯入庫檔案。我們用source來匯入,source實際上會在當前shell上下文中執行命令,從而達到匯入效果。

source 別名 . (點操作符)

我們來看一個例子:

  • 定義函式:funLib.sh 庫檔案
    • 這裡寫圖片描述
  • 匯入庫檔案,function.sh
    • 這裡寫圖片描述
  • 執行結果 bash function.sh
    • 這裡寫圖片描述

從執行結果可以看出,source將funLib.sh引入了function.sh所處的shell上下文中,所以$0顯示的都是function.sh檔名。
在funLib.sh檔案中宣告過的函式在function.sh中可以直接呼叫,實現了定義和使用分別處理。

六、在 .bashrc中定義函式

向方才講述的那樣使用函式,每次都需要自己去匯入定義的庫檔案。那麼,我們可不匯入直接使用呢?答案是可以的。方法就是在shell的配置檔案.bashrc中宣告該函式,因為每次啟動shell都會載入.bashrc檔案,所以就實現了”自動匯入”.

參考資料:

< Linux命令列與shell指令碼程式設計大全 >人民郵電出版社 ISBN-9787115288899

相關推薦

函式(function)--shell學習

在其他語言中,我們多次或者經常重複使用的程式碼片段,會被我們放入一個函式,然後多次引/呼叫該函式就十分方便了。shell指令碼語言也不例外。 我認為,函式是程式碼自身的第一層抽象封裝。 函式:function 一、宣告函式 兩種方式宣告函式

javascript學習記錄(二)-function函式的應用之sort()函式

javascript 雖然式一種弱指令碼語言,但是他也是支援函式的宣告的,此處的函式和java中的函式是有很大差別的。其中值得一提的是javascript 不支援重寫舉個栗子:function someFunction(num1){ console.info(num1);

【深度學習】Tensorflow函式

  目錄 tf.truncated_normal tf.random_normal tf.nn.conv2d tf.nn.max_pool tf.reshape tf.nn.softmax tf.reduce_sum tf.reduce_max,tf.r

PostgreSQL學習手冊(格式化時間函式)

1、簡介 最近在學習PostgreSQL 遇到了一些麻煩,就是時間的轉換問題,然後找了好久終於被我找到了一個,碼上。 2、資料型別格式化函式: PostgreSQL格式化函式提供一套有效的工具用於把各種資料型別(日期/時間、integer、floating

python 學習彙總27:itertools函式( tcy)

itertools函式 2018/11/14 2.1.建立新iter: count(start=0, step=1)#無限迴圈數;按Ctrl + C退出 # 返回均勻間隔值無限流;通常用作map()生成連續資料點的引數。此外,用於zip()新增序列號 g = itertools.count

機器學習中Logistic損失函式以及神經網路損失函式

機器學習中最重要的三個部分為網路結構、損失函式、優化策略。 而其中以損失函式最難以理解,主要原因是需要較強的數學知識,其中用的最多的就是引數估計。 所謂引數估計就是:對未知引數θ進行估計時,在引數可能的取值範圍內選取,使“樣本獲得此觀測值”的概率最大的引數作為θ的估計,這樣選定的有利於”

C語言學習筆記:printf()函式

C語言中有關printf()函式的詳細使用方法: 修飾符: - digit(s) :欄位寬度的最小值。如果該欄位不能容納要列印的數或者字串,系統就會使更寬的欄位。 如%4d。 - .digit(s):精度,將結果保留到小數點後的多少位。 - h: 和整數轉

人臉識別sphereface,損失函式,論文 SphereFace論文學習

原 SphereFace論文學習 2018年02月07日 14:00:30 cdknight_happy 閱讀數:2187

C語言學習筆記---malloc函式

                                                                                            malloc函式詳解 一、malloc函式標頭檔案: #include<stdli

深度學習優化函式(5)-- Nesterov accelerated gradient (NAG)

深度學習優化函式詳解系列目錄 上一篇文章講解了猶如小球自動滾動下山的動量法(momentum)這篇文章將介紹一種更加“聰明”的滾動下山的方式。動量法每下降一步都是由前面下降方向的一個累積和當前點的梯度方向組合而成。於是一位大神(Nesterov)就開始思考,

Python基礎學習資料(語法、函式

目錄 目錄 1 常用函式 5 input() 5 int() 6 len() 7 list() 與tuple相對 8 tuple() 與list相對 9 sum() 10 max() 11 min() 12 print() 13 range() 14 set() 15 sorted() 16

【深度學習基礎-09】神經網路-機器學習深度學習中~Sigmoid函式

目錄 Sigmoid函式常常被用作神經網路中啟用函式   雙曲函式tanh(x) Logistic函式  拓展對比 Sigmoid函式常常被用作神經網路中啟用函式   函式的基本性質: 定義域:(−∞,+∞

ufunc函式( 基礎學習 tcy)

ufunc函式 2018/11/22 # ufunc是universal function的縮寫,是一種能對陣列中每個元素進行操作的函式。 # Numpy內建的許多ufunc函式都是C語言實現的,計算速度非常快 ===============================

ES2017 中的非同步函式(async function)

非同步函式中有兩個新的關鍵字async和await async 就是非同步的意思 await 就是等的意思. 暫停函式的執行, 等待非同步任務完成. 宣告非同步函式 /*使用關鍵字 asy

R語言學習筆記之apply、lapply、sapply、mapply、tapply函式

轉載於:http://blog.csdn.net/wa2003/article/details/45887055 R語言提供了批量處理函式,可以迴圈遍歷某個集合內的所有或部分元素,以簡化操作。 這些函式底層是通過C來實現的,所以效率也比手工遍歷來的高效。批量處理函式有很重

R語言shell、system、shell.exec函式

一、system函式:呼叫引數command指定的作業系統命令system(command,intern=false,ignore.stdout=false,ignore.stderr=false,wa

機器學習--支援向量機(五)核函式

前面我們曾經引入二維資料的非線性的情況,但是那種非線性(並不是真正意義上的非線性)是通過鬆弛因子進行優化的,如果資料比之前還複雜怎麼辦呢? 複雜到即使你怎麼調節C你都無法進行分類,這個時候怎麼辦?如下例子: 這個無論你怎麼調節引數都無法在二維平面內進行線性分離了,但是

ZigBee學習之繫結表管理函式——ZStack API解讀

應用支援子層(APS)  應用支援子層提供如下管理功能:  · 邦定表管理  · 組表管理  · 快速地址查詢  除了管理功能外,APS還提供資料服務,只是應用不能訪問資料服務。應用需要通過AF資料介面AF_DataRequest()來發送資料。如果要使用邦定表函式需要包含BindingTable.h標頭檔案

spring學習筆記(11)@AspectJ研磨分析[2]切點表示式函式

Spring中的AspectJ切點表示式函式 切點表示式函式就像我們的GPS導航軟體。通過切點表示式函式,再配合萬用字元和邏輯運算子的靈活運用,我們能很好定位到我們需要織入增強的連線點上。經過上面的鋪墊,下面來看看Springz中支援的切點表示式函式。

從損失函式的角度常見機器學習演算法(1)

作者:章華燕編輯:趙一帆1、機器學習中常見的損失函式一般來說,我們在進行機器學習任務時,使用的每