shell簡明教程3函數

来源:https://www.cnblogs.com/testing-/archive/2023/08/28/17659382.html
-Advertisement-
Play Games

S905L3A(M401A)拆解, 運行EmuELEC和Armbian. S905Lx系列屬於大客戶版本, 對外沒有公開資料, 最早的 S905L/S905LB 是 S905X 的馬甲, 而這個 S905L3A/S905L3AB 則是 S905X2 的馬甲, 因為在性能評測里這兩個U的得分幾乎一樣.... ...


3 函數

在本章中,您將瞭解為什麼以及何時需要使用函數。 你將學習如何創建函數以及如何使用函數。 我們將討論變數及其作用域。 學習如何使用參數訪問傳遞給函數的參數。 最後,您還將學習如何使用函數處理退出狀態和返回代碼。

電腦編程和應用程式開發中有一個概念叫做 DRY。 DRY 是 "不要重覆"(Don't Repeat Yourself)的縮寫。 通過函數,您只需編寫一次代碼塊,即可多次使用。每次需要執行特定任務或功能時,只需調用包含該代碼的函數,而無需重覆幾行代碼。這有助於縮短腳本的長度,還能讓您在一個地方對給定任務進行更改、測試、故障排除和記錄。所有這些都使腳本更易於維護。

每當您需要在腳本中多次執行同一操作時,這就表明您可能應該為該操作編寫函數。 函數只是可重覆使用的代碼塊,它執行操作並返回退出狀態或返回代碼。 函數在調用前必須先定義。 調用函數時,可以向函數傳遞數據。 您可以在函數中以參數的形式訪問這些數據。

3.1 創建函數

創建函數有兩種方法。 第一種方法是明確使用關鍵字function,然後在關鍵字後面加上函數名稱和括弧。 然後使用開頭的大括弧。 當函數被調用時,後面的代碼或命令將被執行。要結束函數,請使用結尾大括弧。

function function-name() {
    # Code goes here.
}

聲明函數的第二種方法與第一種完全相同,只是在聲明中不使用關鍵字 unction。 其他一切保持不變。

function-name() {
    # Code goes here.
}

3.2 調用函數

要調用函數,只需在腳本中列出函數名稱即可。 調用函數時,不要使用括弧。 你可能在其他編程語言中見過這種語法和樣式,但在shell腳本中不起作用。 只需將函數名稱放在一行中,它就會執行該函數。
運行此腳本時,屏幕上會顯示 "Hello!"。

#!/bin/bash
function hello() {
    echo "Hello!"
}
hello

執行:

$ ./functions-01.sh 
Hello!

函數可以調用其他函數:

#!/bin/bash

function hello() {
    echo "Hello!"
    now
}

function now() {
    echo "It's $(date +%r)"
}

hello

執行:

Hello!
It's 下午 08時42分21秒

函數必須在使用前聲明,不要這樣做:

#!/bin/bash

function hello() {
    echo "Hello!"
    now
}

# This will cause an error as the "now()" function is not yet defined.
hello

function now() {
    echo "It's $(date +%r)"
}

執行:

$ ./functions-03.sh 
Hello!
./functions-03.sh: line 5: now: command not found

腳本語言不是預編譯的。 在某些語言中,你可以在任何地方定義函數,編譯器會檢查所有源代碼,然後將它們拼湊在一起,最終執行程式。 在腳本中,命令和組件會在運行時從上到下讀取。最好將所有函數放在腳本的頂部。 這樣可以確保在使用前定義好所有函數。

3.3 位置參數

使用$1、2等參數訪問這些傳入參數的值。 唯一不同的是,$0仍然是腳本本身的名稱。您不能使用 $0 訪問函數的名稱,但好消息是,無論如何您都不會真的想這樣做。
要向函數發送數據,請在函數名稱後輸入數據。 在本例中,hello 函數的調用只有一個參數,即 Jason 。 這意味著 hello 函數中 $1 的內容是 "Jason"。 正如你所猜測的,這個腳本的輸出就是 "Hello Jason"。

#!/bin/bash

function hello() {
    echo "Hello $1"
}

hello Jason

執行:

$ ./functions-04.sh 
Hello Jason

下麵腳本將迴圈處理傳遞給hello函數的每個參數:

#!/bin/bash

function hello() {
    for NAME in $@
    do
        echo "Hello $NAME"
    done
}

hello Jason Dan Ryan

執行:

$ ./functions-05.sh
Hello Jason
Hello Dan
Hello Ryan

參考資料

3.4 變數作用域

預設情況下,所有變數都是全局變數。 這意味著變數及其值可以在腳本的任何地方訪問,包括在任何函數中。在使用變數之前,必須先定義變數。

#!/bin/bash

my_function() {
    echo "$GLOBAL_VAR"
}

GLOBAL_VAR=1
# The value of GLOBAL_VAR is available to my_function
my_function

執行:

$ ./functions-06.sh
1

如果在函數中定義了全局變數,那麼在函數被調用和執行之前,它在函數之外是不可用的。

#!/bin/bash

my_function() {
    echo "$GLOBAL_VAR"
}

# The value of GLOBAL_VAR is NOT available to my_function since GLOBAL_VAR was defined after my_function was called.
my_function
GLOBAL_VAR=1

執行:

 ./functions-07.sh

#!/bin/bash

my_function() {
    GLOBAL_VAR=1
}

# GLOBAL_VAR not available yet.
echo "GLOBAL_VAR value BEFORE my_function called: $GLOBAL_VAR"

my_function

# GLOBAL_VAR is NOW available
echo "GLOBAL_VAR value AFTER my_function called: $GLOBAL_VAR"

執行:

$ ./functions-08.sh
GLOBAL_VAR value BEFORE my_function called: 
GLOBAL_VAR value AFTER my_function called: 1

3.5 局部變數

局部變數是指只能在聲明它的函數中訪問的變數。 在變數名前使用local關鍵字。 只有在首次使用局部變數時才使用local關鍵字。最佳做法是在函數內部使用局部變數。

#!/bin/bash

my_function() {
    local LOCAL_VAR=1
    echo "LOCAL_VAR can be accessed inside of the function: $LOCAL_VAR"
}

my_function

# LOCAL_VAR is not available outside of the function.
echo "LOCAL_VAR can NOT be accessed outside of the function: $LOCAL_VAR"

執行:

 ./functions-09.sh
LOCAL_VAR can be accessed inside of the function: 1
LOCAL_VAR can NOT be accessed outside of the function: 

3.6 退出狀態和返回代碼

函數也有退出狀態,有時也稱為返回代碼。 可以通過使用return語句明確設置退出狀態,併在後面加上希望返回的狀態。 如果不使用返回語句,函數的退出狀態就是函數中最後執行的命令的退出狀態。
返回語句只接受數字。 只有介於0和255之間的整數才能用作退出狀態。 退出狀態為0表示命令或函數成功完成。非0的退出狀態表示某種類型的錯誤。要訪問函數的退出狀態,請在調用函數後立即使用$?。
在本代碼段中,$?的值將是 my_function 函數的退出狀態。

my_function
echo $?

實例:backup_file函數將創建文件的備份,並將其放入/var/tmp目錄。

#!/bin/bash

function backup_file () {
  # This function creates a backup of a file.

  # Make sure the file exists.
  if [ -f "$1" ] 
  then
    # Make the BACKUP_FILE variable local to this function.
    local BACKUP_FILE="/tmp/$(basename ${1}).$(date +%F).$$"
    echo "Backing up $1 to ${BACKUP_FILE}"

    # The exit status of the function will be the exit status of the cp command.
    cp $1 $BACKUP_FILE
  else
    # The file does not exist, so return an non-zero exit status.
    return 1
  fi
}

# Call the function
backup_file /etc/hosts

# Make a decision based on the exit status of the function.
# Note this is for demonstration purposes.  You could have
# put this functionality inside of the backup_file function.
if [ $? -eq "0" ]
then
  echo "Backup succeeded!"
else
  echo "Backup failed!"
  # Abort the script and return a non-zero exit status.
  exit 1
fi

執行:

$ ./functions-10.sh
Backing up /etc/hosts to /tmp/hosts.2023-08-26.11232
Backup succeeded!
釘釘或微信號: pythontesting 微信公眾號:pythontesting
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 顧名思義,Python中的自動點擊器是一個簡單的Python應用程式,可以按照用戶的要求重覆點擊滑鼠。不同的參數,如速度、頻率和位置,可以根據用戶的要求進行改變。 Python有不同的模塊可用於控制鍵盤、滑鼠等設備。因此,我們可以使用這些模塊在Python中輕鬆創建一個自動點擊器。 本教程將展示在P ...
  • [TOC] spdlog是一個開源、跨平臺、無依賴、只有頭文件的C++11日誌庫,網上介紹的文章有很多這裡就不過多的介紹了,GitHub鏈接:[https://github.com/gabime/spdlog](https://github.com/gabime/spdlog)。 # 引用源碼 先下 ...
  • `fsnotify`是一個用Go編寫的文件系統通知庫。它提供了一種觀察文件系統變化的機制,例如文件的創建、修改、刪除、重命名和許可權修改。它使用特定平臺的事件通知API,例如Linux上的inotify,macOS上的FSEvents,以及Windows上的ReadDirectoryChangesW。 ...
  • 工具提示即 Tool Tip,當用戶把滑鼠移動到某個UI對象上並懸停片刻,就會出現一個“短小精悍”的視窗,顯示一些說明性文本。一般就是功能描述,讓用戶知道這個XX是幹啥用的。 在 Qt 中使用工具提示最方便的做法是直接用 QWidget 類的成員方法:setToolTip。從 QWidget 類派生 ...
  • # 什麼是主席樹 主席樹這個名字看上去很高級,其實不然,它還有另一個名字——可持久化線段樹。 ## 什麼是可持久化 可持久化顧名思義就是它可以變得~~**持久**~~,就是我們對他不斷進行單點修改後,突然查詢它的某一個歷史版本,這就叫可持久化。 # 引入例題 [洛谷3919:可持久化數組](http ...
  • ## 前言: 單例模式是創建型模式5種中的第1種,**關註對象的創建, 保證一個類僅有一個實例,並且提供一個全局訪問點**。在軟體系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。如何繞過常規的構造器,提供一種機制來保證一個類只創建一個實例 ...
  • ## 一、設計模式概述: ​ **設計模式(Design pattern)**代表了最佳的實踐,通常被有經驗的面向對象的軟體開發人員所採用。設計模式是軟體開發人員在軟體開發過程中面臨的一般問題的解決方案。這些解決方案是眾多軟體開發人員經過相當長的一段時間的試驗和錯誤總結出來的。是一套被反覆使用的、多 ...
  • 一、 ManualResetEvent ManualResetEvent是一個同步對象,可以使一個或多個線程等待另一個線程的信號,然後再同時繼續執行。它是通過兩個狀態來實現的:有信號和無信號。 以下是ManualResetEvent的各個方法的介紹: Set方法:將ManualResetEvent的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...