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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...