目錄
- **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狀態碼 |