精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在bash中如何創建函數

CHANBAEK ? 來源:TIAP ? 作者:TIAP ? 2022-12-14 17:31 ? 次閱讀

當你的 bash 腳本中代碼非常多的時候,會看起來很混亂,其中有部分代碼有可能是重復的。這個時候,可以使用函數來避免重復的代碼。

今天我們將介紹在 bash 中如何創建函數,以及函數中的返回值、傳遞參數等內容。

在 bash 中創建函數

創建 bash 函數有兩種不同的語法。最常用的方法如下:

function_name () {
    commands
}

第二種方法不太常用,如下所示:

function function_name {
    commands
}

在使用函數時,需要注意以下幾點:

  • 除非被調用,否則函數永遠不會被執行;
  • 函數必須先定義,然后才能被調用。

作為演示,我們創建一個 fun.sh 腳本,如下代碼:

#!/bin/bash


hello () {
echo "Hello World"
}


hello
hello
hello

上述腳本中,我們定義了一個名為 hello 的函數,它將在終端上打印 Hello World。后面我們調用了三次 hello 函數,因此,運行腳本后,你會在屏幕上看到 Hello World 打印了三次:

$ ./fun.sh
Hello World
Hello World
Hello World

函數的返回值

在很多編程語言中,函數在調用時都會返回一個值,然而,在 bash 函數中沒有返回值。

當函數執行完成時,會返回一個 $? 變量作為退出狀態,0 表示成功執行,其他非零正整數(1 - 255)表示執行失敗。

我們來寫一個例子,命名為 error.sh,在其中寫一個 return 語句,如下代碼所示:

#! /bin/bash


error () {
blabla
return 0
}


error
echo "The return status of the error function is: $?"

執行結果如下:

$ ./error.sh
./error.sh: line 4: blabla: command not found
The return status of the error function is: 0

因為有 return 0 這一行,所以即使函數中有 blabla 這一行的報錯,error 函數還是返回了一個執行成功的狀態碼 0。

return 語句執行后,函數會被立即終止。

向 bash 函數傳遞參數

我們可以向函數傳遞參數,就像向 bash 腳本傳遞參數一樣。

作為演示,我們創建一個名為 iseven.sh 的腳本,如下所示:

#!/bin/bash


iseven () {
    if [ $(($1 % 2)) -eq 0 ]; then
        echo "$1 is even."
    else
        echo "$1 is odd."
    fi
}


iseven 3
iseven 4
iseven 20
iseven 111

iseven() 函數判斷數字是偶數還是奇數。在調用的時候,將參數放在函數名后面,函數執行的時候會讀取 $1 來獲取傳遞的參數。我們來執行一下:

$ ./iseven.sh
3 is odd.
4 is even.
20 is even.
111 is odd.

這里需要注意,bash 函數中的參數,和 bash 腳本的參數需要區分開來,看如下 funarg.sh 腳本:

#!/bin/bash


fun () {
echo "$1 is the first argument to fun()"
echo "$2 is the second argument to fun()"
}


echo "$1 is the first argument to the script."
echo "$2 is the second argument to the script."


fun Yes 7

執行結果如下:

$ ./funarg.sh Cool Stuff
Cool is the first argument to the script.
Stuff is the second argument to the script.
Yes is the first argument to fun()7 is the second argument to fun()

可以看到,同樣是使用 $1 和 $2 來引用腳本參數和函數參數,當實際調用時,取值是不同的。

bash 函數中的全局變量和局部變量

與大多數編程語言累死,bash 變量具有全局變量和局部變量之分。其中全局變量可以在任何位置方位到,而局部變量只能在其定義的函數中訪問。

作為演示,看如下 scope.sh 腳本:

#!/bin/bash


v1='A'
v2='B'


myfun() {
    local v1='C'
    v2='D'
    echo "Inside myfun(): v1: $v1, v2: $v2"
}


echo "Before calling myfun(): v1: $v1, v2: $v2"
myfun
echo "After calling myfun(): v1: $v1, v2: $v2"

我們首先定義了兩個全局變量 **v1 v2 ,然后在 函數 myfun() 中,使用 local 關鍵字 定義了一個局部變量 ** v1 ,并修改了全局變量 v2 。在不同的函數中,局部變量可以使用相同的變量名。

執行一下,結果如下:

$ ./scope.sh
Before calling myfun(): v1: A, v2: B
Inside myfun(): v1: C, v2: D
After calling myfun(): v1: A, v2: D

由此,我們可以看到:

  • 如果局部變量的變量名與全局變量的變量名相同,那么局部變量優先級會更高;
  • 在函數中可以更改全局變量的值。

遞歸函數

遞歸函數是一個調用自身的函數。階乘計算是遞歸函數的經典例子,看下面的腳本 factorial.sh:

#!/bin/bash


factorial () {
    if [ $1 -le 1 ]; then
        echo 1
    else
        last=$(factorial $(( $1 -1)))
        echo $(( $1 * last ))
    fi
}


echo -n "4! is: "
factorial 4
echo -n "5! is: "
factorial 5
echo -n "6! is: "
factorial 6

任何遞歸函數都要從一個基本條件開始,這個基本條件必須可以結束遞歸函數調用鏈。在 factorial() 函數中,基本條件為:

if [ $1 -le 1 ]; then
    echo 1

然后導出階乘函數的遞歸情況。要計算 n 的階乘,其中 n 是大于 1 的正數,可以將 n 乘以 n-1 的階乘:

factorial(n) = n * factorial(n-1)

使用上面那個公式來編寫遞歸函數的算法

last=$(factorial $(( $1 -1)))
    echo $(( $1 * last ))

然后運行一下,檢查運行結果:

$ ./factorial.sh
4! is: 24
5! is: 120
6! is: 720
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4304

    瀏覽量

    62427
  • 腳本
    +關注

    關注

    1

    文章

    387

    瀏覽量

    14830
  • Bash
    +關注

    關注

    0

    文章

    57

    瀏覽量

    10169
收藏 人收藏

    評論

    相關推薦

    如何在bash腳本創建第一個數組

    在前面的文章,我們介紹了如何在 bash 中使用有限數量的變量,比如要保存一個或兩個文件名或用戶名。
    發表于 12-02 16:53 ?836次閱讀
    如何在<b class='flag-5'>bash</b>腳本<b class='flag-5'>中</b><b class='flag-5'>創建</b>第一個數組

    labview創建文件函數時出現 memory is full 的問題

    `labview創建文件函數時出現 memory is full 的問題,這個問題是不是由于沒有加入關閉文件函數引起的呢`
    發表于 12-25 14:12

    如何更新Vivado 2014.2bash shell版本?

    如何更新Vivado 2014.2bash shell版本?謝謝!
    發表于 03-20 07:47

    為什么UCOSIII外部中斷服務函數不能開啟已經創建的軟件定時器?

    一個外部中斷服務函數,開啟一個已經創建的軟件定時器,會開啟不成功返回的錯誤碼:OS_ERR_TMR_ISR錯誤碼說明:if the call was made from an IS
    發表于 06-02 14:13

    C語言入門教程-創建一個函數

    創建一個函數庫 上述程序的rand和bubble_sort函數很實用,很可能在您寫其他程序時也能派上用場。為了能更方便地重復使用,您可以為它們
    發表于 07-29 11:18 ?3121次閱讀

    10個方便的Bash別名

    要使用你創建Bash 別名,你需要將其添加到 .bash_profile ,該文件位于你的家目錄。請注意,此文件是隱藏的,并只能從命
    的頭像 發表于 10-16 15:00 ?2713次閱讀

    怎樣MATLAB創建函數

    。如果這樣做不能解決問題,請在“腳本窗口”重新打開函數,并確保沒有錯誤。代碼正確輸出后,您將成功創建您的第一個MATLAB函數
    的頭像 發表于 11-04 11:07 ?2.1w次閱讀
    怎樣<b class='flag-5'>在</b>MATLAB<b class='flag-5'>中</b><b class='flag-5'>創建</b><b class='flag-5'>函數</b>

    fork函數的作用_fork函數創建進程

     Linuxfork函數是非常重要的函數,它的作用是從已經存在的進程創建一個子進程,而原進
    發表于 12-01 13:41 ?7850次閱讀
    fork<b class='flag-5'>函數</b>的作用_fork<b class='flag-5'>函數</b><b class='flag-5'>創建</b>進程

    Bash 中比較 $() 與 ${}

    像 Linux 這樣的基于 GNU 的操作系統依賴于一個名為 Bash 的命令語言解釋器或 Shell 來完成它們的大部分計算任務和目標。
    的頭像 發表于 09-09 09:24 ?658次閱讀

    如何在bash shell腳本接受參數

    終端命令通常包含一些參數,使用的時候可以提供不同的參數來確定命令的執行方式。POSIX規范包含了用于命令行接口的選項。這也是與最早的UNIX應用程序建立的一個由來已久的約定,所以當你b
    的頭像 發表于 12-09 17:34 ?2649次閱讀

    Bash腳本特殊變量$0是什么?

    Bash 腳本,`$0` 是一個特殊變量,它代表當前腳本的路徑和名稱。這個變量用于表示腳本自身,它是 Bash 環境的一個重要組成部
    的頭像 發表于 05-12 14:41 ?1820次閱讀

    shell腳本基礎函數

    bash定義函數 function和函數名字可以任意省略一個 需要注意的是,函數必須在被調用
    的頭像 發表于 05-22 09:20 ?456次閱讀
    shell腳本基礎<b class='flag-5'>函數</b>

    linux操作系統的進程創建和銷毀函數解析

    第一次遇見創建進程是Linux啟動流程,reset_init函數調用kernel_thread函數
    發表于 06-26 09:12 ?694次閱讀
    linux操作系統<b class='flag-5'>中</b>的進程<b class='flag-5'>創建</b>和銷毀<b class='flag-5'>函數</b>解析

    bash如何進行各種文件重定向呢?

    本文會用以下測試程序,來演示bash,如何進行各種文件重定向
    的頭像 發表于 08-25 09:31 ?1175次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>bash</b><b class='flag-5'>中</b>如何進行各種文件重定向呢?

    BASH shell腳本篇—函數

    函數是代碼重用的最重要方式。Bash函數可以定義為一組命令,bash腳本多次調用。
    的頭像 發表于 10-20 16:31 ?1032次閱讀