Shell編程-09-Shell中的函數

来源:https://www.cnblogs.com/surpassme/archive/2018/11/22/10004309.html
-Advertisement-
Play Games

    函數可以簡化程式的代碼量,達到更好的代碼復用度,因此會讓程式變得更加易讀、簡潔和易修改。其作用就是將需要多次使用的代碼整合到一塊,使其成為一個整體,然後通過函數名即可完成調用。 基本語法 其他簡化寫法如下 或 建議採用非簡化的書寫方式,方便閱讀代碼 函數執行 1、執行不帶 ...


    函數可以簡化程式的代碼量,達到更好的代碼復用度,因此會讓程式變得更加易讀、簡潔和易修改。其作用就是將需要多次使用的代碼整合到一塊,使其成為一個整體,然後通過函數名即可完成調用。

基本語法

function functionName () {
   語句
   return n
}

其他簡化寫法如下

function functionName {
   語句
   return n
}

functionName () {
   語句
   return n
}

建議採用非簡化的書寫方式,方便閱讀代碼

函數執行

  • 1、執行不帶參數的函數,直接輸入函數名即可,不需要帶括弧,如下所示:
functionName
  • 執行函數時,函數名前的關鍵字function和函數名後面的()均不需要帶
  • 函數的定義必須要在執行的程式前定義或載入
  • 2、帶參數的函數執行語法如下所示:
functionName arg1 arg2
> - Shell中的位置參數($1/$2.../$#/$?/$@)均可以做為函數的參數進行傳遞
> - $0比較特殊,仍然是父腳本的名稱
> - 此時父腳本的參數會臨時被函數的參數所掩蓋或隱藏
> - 函數的參數變數是在函數體內裡面進行定義

函數的執行總結如下:

  • 1、Shell各種程式的執行順序為:系統別名->函數->系統命令->可執行文件等
  • 2、函數執行時,會和調用它的腳本共用變數,也可以為函數設定局部變數及特殊位置參數
  • 3、在Shell函數裡面,return和exit功能類似,區別是return是退出函數,exit則是退出腳本
  • 4、return語句會返回一個值給調用函數的程式,exit則會返回一個值給執行當前腳本的Shell
  • 5、如果將函數單獨存放為一個文件,在載入時需要使用source或 . 進行載入
  • 6、在函數內部一般使用local定義局部變數,僅在函數體內有效

函數示例

1、示例1:調用函數

[root@localhost Test]# cat testfunction.sh
#!/bin/bash

# first function
function HelloWorld() {
  echo "Hello world"
}
# second function
Welcome() {
  echo "Welcome to Shanghai"
}
# third function
function HelloShell {
 echo "Hello Shell"
}
# invoke functions
HelloWorld # 調用函數
Welcome
HelloShell
[root@localhost Test]# bash testfunction.sh
Hello world
Welcome to Shanghai
Hello Shell

2、示例2:從文件中調用函數

[root@localhost Test]# cat invokefunction.sh
function Sum () {
 for((i=1;i<=100;i++))
  do
    ((sum=sum+i))
  done
  echo '{1..100} sum is :' $sum
}
[root@localhost Test]# cat invokefunctionfromfile.sh
#!/bin/bash
path="/root/Test/invokefunction.sh"
if [ -f ${path} ]
   then
    source $path # 載入函數
    Sum          # 調用函數
else
   echo "file not exist or error"
fi
[root@localhost Test]# bash invokefunctionfromfile.sh
{1..100} sum is : 5050

3、示例3:函數參數傳遞

[root@localhost Test]# cat functionwithargs.sh
#!/bin/bash
function Add () {    # 定義函數
  ((sum=$1+$2))
  echo "$1 + $2 sum is" ${sum}
}
Add $1 $2           # 調用函數並傳遞參數

[root@localhost Test]# bash functionwithargs.sh 100 150
100 + 150 sum is 250
[root@localhost Test]# bash functionwithargs.sh 509 150
509 + 150 sum is 659

4、示例4:使用return返回函數運行結果

[root@localhost Test]# cat functionwithreturn.sh
#!/bin/bash
function TestReturn() {
  if [ -d $1 ]
    then
      return "122"
   else
      return "222"
  fi
}

TestReturn $1
result=$? # 獲取函數返回值
if [ ${result} == "122" ]
 then
   echo "$1 exist ,return value is:" ${result}
 else
   echo "$1 not exist ,return value is:" ${result}
fi

[root@localhost Test]# bash functionwithreturn.sh /etc/sysconfiggg
/etc/sysconfiggg not exist ,return value is: 222
[root@localhost Test]# bash functionwithreturn.sh /etc/sysconfig
/etc/sysconfig exist ,return value is: 122

在該示例中,主要通過$?獲取返回值,但返回值的範圍只能是0~255

5、示例5:使用echo返回函數運行結果

[root@localhost Test]# cat functionwithecho.sh
#!/bin/bash
function TestReturn() {
  if [ -d $1 ]
    then
      echo "122"
   else
      echo "222"
  fi
}

result=$(TestReturn $1) # 獲取函數返回值
if [ ${result} == "122" ]
 then
   echo "$1 exist ,return value is:" ${result}
 else
   echo "$1 not exist ,return value is:" ${result}
fi

[root@localhost Test]# bash functionwithecho.sh /etc/sysconfig
/etc/sysconfig exist ,return value is: 122
[root@localhost Test]# bash functionwithecho.sh /etc/sysconfiggg
/etc/sysconfiggg not exist ,return value is: 222

在該示例中,主要使用$()獲取返回值,在該方法中,沒有範圍限制,是一種比較安全的返回方式。

[root@localhost Test]# cat functionwithecho.sh
#!/bin/bash
function TestReturn() {
  if [ -d $1 ]
    then
      echo "$1 exist"
   else
      echo "$1 not exist"
  fi
}

result=$(TestReturn $1) # 獲取返回值,返回的結果是字元串
if [ "${result}" == "$1 exist" ]
 then
   echo "$1 exist ,return value is:" ${result}
 else
   echo "$1 not exist ,return value is:" ${result}
fi

[root@localhost Test]# bash functionwithecho.sh /etc/sysconfiggg
/etc/sysconfiggg not exist ,return value is: /etc/sysconfiggg not exist
[root@localhost Test]# bash functionwithecho.sh /etc/sysconfig
/etc/sysconfig exist ,return value is: /etc/sysconfig exist

本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註:
MyQRCode.jpg


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • WPF自定義TabControl,TabControl美化 XAML代碼: <TabControl x:Class="SunCreate.Common.Controls.TabControlEx" xmlns="http://schemas.microsoft.com/winfx/2006/xaml ...
  • 資源文件代碼: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> ...
  • C# -- 交錯數組的使用 交錯數組是元素為數組的數組。交錯數組元素的維度和大小可以不同。交錯數組有時稱為“數組的數組”。 1. 舉例一:子數組是長度相同的一維數組 2. 舉例二:子數組是長度不同的一維數組 3. 舉例三:子數組是長度不同的二維數組 ...
  • 昨天遇到了很奇怪的一個bug,具體描述如下: 這個系統是c/s架構的針對多個工廠做的資材管理系統,由於有很多個工廠,每個工廠都有自己的伺服器。所以需要動態的改變連接字元串去鏈接不同的伺服器。 由於這個連接字元串放在了app.config文件中,所以公司上一個開發人員設置為,當選擇不同公司時會讓程式關 ...
  • 如果驗證出現如下錯誤 Failed to load /opt/dotnet/shared/Microsoft.NETCore.App/1.1.0/libcoreclr.so, error: libunwind.so.8: cannot open shared object file: No such ...
  • //測試環境office2016、office365 string InsertPath= @"E:\\新建文件夾\\2.xls";//插入的文檔路徑 string openfile = string.Empty; excelFileName = @"E:\\1.xls";//使用的文檔路徑 App ...
  • 有道翻譯有官方介面,也有非官方介面。 有道官方介面 官方介面:https://openapi.youdao.com/openapi 可查詢英語單詞註釋、單詞發音、網路釋義(不一定存在),可獲取線上發音地址。 具體使用,可參考 C# 有道API翻譯 查詢單詞詳細信息 有道非官方介面 何謂非官方介面,即 ...
  • 軟體包管理命令: sudo apt-cache search package #搜索包 sudo apt-cache show package #獲取包的相關信息,如說明、大小、版本 sudo apt-get install package #安裝包。可以在install加-y,代表安裝過程中所有選 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...