一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

3天內(nèi)不再提示

在bash中如何創(chuàng)建函數(shù)

CHANBAEK ? 來源:TIAP ? 作者:TIAP ? 2022-12-14 17:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

今天我們將介紹在 bash 中如何創(chuàng)建函數(shù),以及函數(shù)中的返回值、傳遞參數(shù)等內(nèi)容。

在 bash 中創(chuàng)建函數(shù)

創(chuàng)建 bash 函數(shù)有兩種不同的語法。最常用的方法如下:

function_name () {
    commands
}

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

function function_name {
    commands
}

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

  • 除非被調(diào)用,否則函數(shù)永遠不會被執(zhí)行;
  • 函數(shù)必須先定義,然后才能被調(diào)用。

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

#!/bin/bash


hello () {
echo "Hello World"
}


hello
hello
hello

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

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

函數(shù)的返回值

在很多編程語言中,函數(shù)在調(diào)用時都會返回一個值,然而,在 bash 函數(shù)中沒有返回值。

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

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

#! /bin/bash


error () {
blabla
return 0
}


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

執(zhí)行結(jié)果如下:

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

因為有 return 0 這一行,所以即使函數(shù)中有 blabla 這一行的報錯,error 函數(shù)還是返回了一個執(zhí)行成功的狀態(tài)碼 0。

return 語句執(zhí)行后,函數(shù)會被立即終止。

向 bash 函數(shù)傳遞參數(shù)

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

作為演示,我們創(chuàng)建一個名為 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() 函數(shù)判斷數(shù)字是偶數(shù)還是奇數(shù)。在調(diào)用的時候,將參數(shù)放在函數(shù)名后面,函數(shù)執(zhí)行的時候會讀取 $1 來獲取傳遞的參數(shù)。我們來執(zhí)行一下:

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

這里需要注意,bash 函數(shù)中的參數(shù),和 bash 腳本的參數(shù)需要區(qū)分開來,看如下 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

執(zhí)行結(jié)果如下:

$ ./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 來引用腳本參數(shù)和函數(shù)參數(shù),當實際調(diào)用時,取值是不同的。

bash 函數(shù)中的全局變量和局部變量

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

作為演示,看如下 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 ,然后在 函數(shù) myfun() 中,使用 local 關(guān)鍵字 定義了一個局部變量 ** v1 ,并修改了全局變量 v2 。在不同的函數(shù)中,局部變量可以使用相同的變量名。

執(zhí)行一下,結(jié)果如下:

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

由此,我們可以看到:

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

遞歸函數(shù)

遞歸函數(shù)是一個調(diào)用自身的函數(shù)。階乘計算是遞歸函數(shù)的經(jīng)典例子,看下面的腳本 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

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

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

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

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

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

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

然后運行一下,檢查運行結(jié)果:

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

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64945
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    398

    瀏覽量

    28495
  • Bash
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    10471
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    如何在bash腳本創(chuàng)建第一個數(shù)組

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

    labview創(chuàng)建文件函數(shù)時出現(xiàn) memory is full 的問題

    `labview創(chuàng)建文件函數(shù)時出現(xiàn) memory is full 的問題,這個問題是不是由于沒有加入關(guān)閉文件函數(shù)引起的呢`
    發(fā)表于 12-25 14:12

    為什么UCOSIII外部中斷服務(wù)函數(shù)不能開啟已經(jīng)創(chuàng)建的軟件定時器?

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

    C語言入門教程-創(chuàng)建一個函數(shù)

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

    10個方便的Bash別名

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

    怎樣MATLAB創(chuàng)建函數(shù)

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

    fork函數(shù)的作用_fork函數(shù)創(chuàng)建進程

     Linuxfork函數(shù)是非常重要的函數(shù),它的作用是從已經(jīng)存在的進程創(chuàng)建一個子進程,而原進
    發(fā)表于 12-01 13:41 ?8400次閱讀
    fork<b class='flag-5'>函數(shù)</b>的作用_fork<b class='flag-5'>函數(shù)</b><b class='flag-5'>創(chuàng)建</b>進程

    Bash 中比較 $() 與 ${}

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

    如何在bash shell腳本接受參數(shù)

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

    bash腳本的循環(huán)功能

    循環(huán)是 bash 腳本中一個很重要的功能,用途廣泛。本篇文章我們介紹三種不同的循環(huán),然后利用循環(huán)遍歷數(shù)組。
    的頭像 發(fā)表于 12-14 17:30 ?3912次閱讀

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

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

    shell腳本基礎(chǔ)函數(shù)

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

    linux操作系統(tǒng)的進程創(chuàng)建和銷毀函數(shù)解析

    第一次遇見創(chuàng)建進程是Linux啟動流程,reset_init函數(shù)調(diào)用kernel_thread函數(shù)創(chuàng)
    發(fā)表于 06-26 09:12 ?896次閱讀
    linux操作系統(tǒng)<b class='flag-5'>中</b>的進程<b class='flag-5'>創(chuàng)建</b>和銷毀<b class='flag-5'>函數(shù)</b>解析

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

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

    BASH shell腳本篇—函數(shù)

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