N年后的第一更,這里主要記錄一些平時自己不太注意的點
1. shell腳本開頭要注明解釋器,並且推薦下面這種方式:
#!/usr/bin/env bash
2. 一行代碼太長,需要用 “\” 進行分行,看起來更美觀
./configure \ -prefix=/usr \ -sbin-path=/usr/sbin/nginx \ -conf-path=/etc/nginx/nginx.conf
3. 在腳本中獲取外部命令返回值的正確方式:
Num=$(wc -l FileName.txt|awk '{print $1}')
4. 在定義函數時,最好對函數的輸入輸出類型做注釋
[] <- () # 輸入空,輸出空 [String] <- (var1: String, var2: String) # 輸入兩個字符型變量,輸出字符型 [Boolean] <- (var1: String, var2: Int) # 輸入字符型變量1,整型變量2,輸出布爾值 [] <- (var1: String)
例如:
#[string] <- (string)
Test(){
Name=$1
echo "Hello! My Name is:" ${Name}
}
5. 一般用於外部調用的函數,用function定義;如果僅腳本內部使用,建議不加function關鍵詞
# 通常情況下用於外部調用 function External(){ XXXX } # 通常情況下僅腳本內使用 Internal(){ XXXX }
6. 在函數內部定義變量時,盡量使用local進行定義,限制變量作用范圍
func(){ local var=2 echo ${var} }
7. shell腳本函數返回值只能是整數,string類型的返回值是會報錯的;
通常情況下整數推薦使用echo;Boolean類型推薦使用return;
獲取函數返回值可以使用return或者在函數內用echo
func(){ echo "Nothing print" } Info=$(func) echo "This is from Func ${Info}."
# 或者使用return返回,在獲取返回值時,只能用 $? 進行捕獲
func(){ local var=2 return ${var} } func echo "Function return value is:" $?
8. shell函數調用
調用外部腳本中的函數之前,需要先source一下腳本,推薦使用相對路徑!(source腳本時,會將腳本中的全局變量、函數加載到當前腳本中)(外部調用的函數,在定義時最好使用function定義)
在腳本內部執行外部腳本: bash + 腳本名稱
#!/usr/bin/env bash
source ./../../BaseShell/Log/BaseLog.sh function f1(){ echo "I am f1" }
function main(){ log_info "LINENO:${LINENO} 開始執行" #調用 ./../../BaseShell/Log/BaseLog.sh 中的函數,需要先用source BaseLog.sh f1 #在函數內部調用當前腳本內的函數 log_success "LINENO:${LINENO} 結束執行" #調用 ./../../BaseShell/Log/BaseLog.sh 中的函數 }
main #在腳本內部調用當前腳本內的函數 bash ChangBaiShanFetcher.sh #執行其他腳本 bash ChangBaiShanFetcher.sh main #執行其他腳本的main方法,前提是 ChangBaiShanFetcher.sh 腳本 支持按函數名調用
9. 會使用shellcheck對代碼進行檢查
