Bash函數詳解

目錄

    • **1. 基礎函數**
    • **2. 參數處理函數**
    • **3. 文件操作函數**
    • **4. 日志與錯誤處理**
    • **5. 實用工具函數**
    • **6. 高級函數技巧**
    • **7. 常用函數庫示例**
    • **總結:Bash 函數核心要點**

1. 基礎函數

1.1 定義與調用

可以自定義函數名稱,例如將greet改為yana。? 不能以數字開頭(如 1greet ),建議全小寫+下劃線(社區慣例)。

# 定義函數
greet() {echo "Hello, $1!"
}# 調用函數
greet "Alice"  # 輸出: Hello, Alice!

1.2 檢查數字是否為偶數

# 通過 return 返回狀態碼(0-255)
is_even() {if (( $1 % 2 == 0 )); thenreturn 0  # 成功(偶數)elsereturn 1  # 失敗(奇數)fi
}# 調用并檢查返回值
is_even 4 && echo "偶數" || echo "奇數"

2. 參數處理函數

2.1 計算兩數之和

sum() {echo $(( $1 + $2 ))
}
sum 3 5  # 輸出: 8

2.2 打印所有參數($@

print_args() {for arg in "$@"; doecho "參數: $arg"done
}
print_args "A" "B" "C"
#$@ 指所有參數的列表

2.3 帶默認值的問候

greet_user() {local name=${1:-"Guest"}  # 默認值 "Guest"echo "Welcome, $name!"
}
greet_user  # 輸出: Welcome, Guest!

3. 文件操作函數

3.1 檢查文件是否存在

file_exists() {[ -f "$1" ] && return 0 || return 1
}
file_exists "/etc/passwd" && echo "文件存在"
`||`:如果前一個命令失敗(返回非零退出碼),則執行后一個命令。
`&&`:如果前一個命令成功(返回零退出碼),則執行后一個命令
`return`退出函數,返回值給這個函數;與`exit`的區別是,exit用于關閉所有的文件,結束正在運行的整個程序,他將參數返回給OS(操作系統)。
`return 0`:代表程序正常退出
`return 1`:代表程序異常退出

3.2 創建文件備份

backup_file() {local file="$1"cp -v "$file" "${file}.bak" || return 1
}
backup_file "data.txt"

4. 日志與錯誤處理

4.1 格式化日志記錄

log() {local level=$1local msg=$2echo "[$(date +'%Y-%m-%d %H:%M:%S')] [$level] $msg" >> "/var/log/myscript.log"
}
log "INFO" "腳本啟動"

4.2 錯誤退出腳本

die() {echo "[ERROR] $1" >&2exit 1
}
[ -d "/data" ] || die "目錄 /data 不存在"

5. 實用工具函數

5.1 字符串轉大寫

# 轉大寫
to_upper() {echo "${1^^}"
}
to_upper "hello"  # 輸出: HELLO# 反轉字符串
reverse_str() {echo "$1" | rev
}
reverse_str "Bash"  # 輸出: hsaB

5.2 網絡連通性檢查

check_internet() {ping -c1 google.com &>/dev/null && return 0 || return 1
}
check_internet || die "網絡連接失敗"

6. 高級函數技巧

6.1 函數返回字符串

獲取主機名

get_hostname() {echo "$HOSTNAME"  # 通過 stdout 返回
}
host=$(get_hostname)  # 捕獲輸出

6.2 局部變量(避免污染全局)

統計目錄文件數

count_files() {local dir="$1"  # 局部變量ls "$dir" | wc -l
}

6.3 將函數作為參數調用

apply_operation() {local func=$1local arg=$2$func "$arg"
}# 調用
apply_operation to_upper "hello"  # 輸出: HELLO

7. 常用函數庫示例

utils.sh(可復用的函數庫)

檢查是否為 root 用戶,然后自動安裝軟件包 。

#!/bin/bash
# 常用函數庫# 日志記錄
log() {echo "[$(date)] $1"
}# 檢查root權限
check_root() {[ "$(id -u)" -eq 0 ] || die "需要root權限"
}# 安裝依賴
install_pkg() {local pkg=$1if ! command -v "$pkg" &>/dev/null; thenapt-get install -y "$pkg" || die "安裝 $pkg 失敗"fi
}

調用方式

source utils.sh
check_root
install_pkg "curl"

總結:Bash 函數核心要點

特性說明
定義語法func_name() { ... }function func_name { ... }
參數傳遞通過 $1, $2, $@ 獲取
返回值通過 return 返回狀態碼,或通過 echo 輸出結果
局部變量使用 local var 避免污染全局作用域
最佳實踐函數名小寫+下劃線,添加注釋,優先返回0/1狀態碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914356.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914356.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python爬蟲實戰:研究rows庫相關技術

1. 引言 在當今數字化時代,互聯網上存在著大量有價值的表格數據,這些數據以 HTML 表格、CSV、Excel 等多種格式存在。然而,由于數據源的多樣性和不規范性,表格結構往往存在復雜表頭、合并單元格、不規則數據行等問題,給數據的自動化處理帶來了巨大挑戰。 傳統的數據處理工…

通過同態加密實現可編程隱私和鏈上合規

1. 引言 2023年9月28日,a16z 的加密團隊發布了 Nakamoto Challenge,列出了區塊鏈中需要解決的最重要問題。尤其是其中的第四個問題格外引人注意:“合規的可編程隱私”,因為Zama團隊已經在這方面積極思考了一段時間。本文提出了使…

封裝---統一封裝處理頁面標題

一.采用工具來實現(setPageTitle.ts)多個頁面中用更統一的方式設置 document.title,可以封裝一個工具函數:在utils目錄下新建文件:setPageTitle.ts如果要在每個頁面設置相同的網站標志可以使用下面的appNameconst appName: string import.meta.env.VITE_APP_NAMEex…

JAVA學習筆記 首個HelloWorld程序-002

目錄 1 前言 2 開發首個程序 3 小結 1 前言 在所有的開發語言中,基本上首先程序就是輸出HelloWorld,這里也不例外。這個需要注意的是,程序的核心功能是數據輸出,是要有一個結果,可能沒有輸入,但是一定有…

智慧監所:科技賦能監獄管理新變革

1. 高清教育:告別模糊畫面,學習更清晰傳統電視的雪花屏終于成為歷史!新系統采用高清傳輸,課件文字清晰可見,教學視頻細節分明。某監獄教育科王警官說:"現在播放法律課程,服刑人員能清楚看到…

專題:2025供應鏈數智化與效率提升報告|附100+份報告PDF、原數據表匯總下載

全文鏈接:https://tecdat.cn/?p42926 在全球產業鏈重構與數字技術革命的雙重驅動下,供應鏈正經歷從傳統經驗驅動向數據智能驅動的范式變革。從快消品產能區域化布局到垂類折扣企業的效率競賽,從人形機器人的成本優化到供應鏈金融對中小企業的…

uniapp+vue3+ts項目:實現小程序文件下載、預覽、進度監聽(含項目、案例、插件)

uniapp+vue3+ts項目:實現小程序文件下載、預覽、進度監聽(含項目、案例、插件) 支持封裝調用: 項目采用uniapp+vue3+ts +京東nutUI 開發nutUi文檔:loadingPage組件:https://uniapp-nutui.tech/components/exhibition/loadingpage.html案例效果圖: 略博主自留地:參考本地…

用Python和OpenCV從零搭建一個完整的雙目視覺系統(六 最終篇)

本系列文章旨在系統性地闡述如何利用 Python 與 OpenCV 庫,從零開始構建一個完整的雙目立體視覺系統。 本項目github地址:https://github.com/present-cjn/stereo-vision-python.git 1. 概述 歡迎來到本系列文章的最后一篇。在過去的幾篇文章中&#…

Android View 繪制流程 簡述 (無限遞歸+BitMap問題)

繪制流程 在 Android 的 View 系統中,draw(canvas) 和 dispatchDraw(canvas) 是繪制流程中的兩個關鍵方法: 1. draw(canvas) 方法的作用 draw(canvas) 是 View 類中的核心繪制方法,它的主要職責包括: 繪制背景 - 調用 drawBac…

算法學習筆記:18.拉斯維加斯算法 ——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

在隨機化算法領域,拉斯維加斯(Las Vegas)算法以其獨特的設計思想占據重要地位。與蒙特卡洛(Monte Carlo)算法不同,拉斯維加斯算法總能給出正確的結果,但運行時間具有隨機性 —— 在最壞情況下可…

26-計組-指令執行過程

一、指令周期1. 定義與組成定義:CPU取出并執行一條指令所需的全部時間,稱為指令周期。子周期劃分:取指周期(必選):從存儲器取指令到指令寄存器(IR)。間址周期(可選&#…

【JMeter】數據驅動測試

文章目錄創建數據文件加載數據文件根據數據文件請求接口、傳遞參數拓展含義:根據數據的數量、內容,自動的決定用例的數據和內容。數據驅動測試用例。步驟: 創建數據文件加載數據文件根據數據文件請求接口、傳遞參數 創建數據文件 Jmeter支…

Springboot實現一個接口加密

首先來看效果這個主要是為了防止篡改請求的。 我們這里采用的是一個AOP的攔截,在有需要這樣的接口上添加了加密處理。 下面是一些功能防篡改HMAC-SHA256 參數簽名密鑰僅客戶端 & 服務器持有防重放秒級時間戳 有效窗口校驗默認允許 5 分鐘防竊聽AES/CBC/PKCS5Pa…

斯坦福 CS336 動手大語言模型 Assignment1 BPE Tokenizer TransformerLM

所有代碼更新至 https://github.com/WangYuHang-cmd/CS336/tree/main/assignment1-basics 作業文件結構: CS336/assignment1-basics/ ├── tests/ # 測試文件目錄 │ ├── adapters.py # 適配器測試 │ ├── conftest.py # pyt…

Spring Cloud Gateway 實戰指南

關鍵詞:微服務、API網關、Spring Cloud Gateway、路由轉發、限流熔斷 ? 文章摘要 隨著互聯網應用規模的不斷擴大,傳統的單體架構逐漸向微服務架構轉型。在微服務架構中,API 網關作為系統的入口點,承擔了諸如請求路由、負載均衡、…

PyTorch自動微分:從基礎到實戰

目錄 1. 自動微分是什么? 1.1 計算圖 1.2 requires_grad 屬性 2. 標量和向量的梯度計算 2.1 標量梯度 2.2 向量梯度 3. 梯度上下文控制 3.1 禁用梯度計算 3.2 累計梯度 4. 梯度下降實戰 4.1 求函數最小值 4.2 線性回歸參數求解 5. 總結 在深度學習中&a…

Spring AI 項目實戰(十六):Spring Boot + AI + 通義萬相圖像生成工具全棧項目實戰(附完整源碼)

系列文章 序號文章名稱1Spring AI 項目實戰(一):Spring AI 核心模塊入門2Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼)3Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼)4

從零到一:企業如何組建安全團隊

在這個"黑客滿天飛,漏洞遍地跑"的時代,沒有安全團隊的企業就像裸奔的勇士——雖然很有勇氣,但結局往往很悲慘。 📋 目錄 為什么要組建安全團隊安全團隊的核心職能團隊架構設計人員配置策略技術體系建設制度流程建立實施…

業務訪問控制-ACL與包過濾

業務訪問控制-ACL與包過濾 ACL的定義及應用場景ACL(Access Control List,訪問控制列表)是用來實現數據包識別功能的;ACL可以應用于諸多場景: 包過濾功能:對數據包進行放通或過濾操作。NAT(Netwo…

穿梭時空的智慧向導:Deepoc具身智能如何賦予導覽機器人“人情味”

穿梭時空的智慧向導:Deepoc具身智能如何賦予導覽機器人“人情味”清晨,當第一縷陽光透過高大的彩繪玻璃窗,灑在博物館光潔的地板上,一位特別的“館員”已悄然“蘇醒”。它沒有制服,卻有著清晰的指引;它無需…