linux shell 編程之函數使用詳解
前言
使用linux的shell編程,可以說函數是非常重要的內容,也是在編寫各類shell腳本的時候經常用到的,本篇將介紹下函數相關的使用。
shell 函數分類
- 系統函數
- 自定義函數
系統函數
系統函數為linux自帶的函數, 可以在shell編寫中直接使用。下面介紹幾種常用的系統函數
1、basename
用於獲取文件名函數, 根據給出的文件路徑截取出文件名;
語法
basename [string / pathname] [suffix]
- 根據根據指定字符串或路徑名進行截取文件名, 比如: 根據路徑"/root/shells/aa.txt", 可以截取出aa.txt;
- suffix: 用於截取的時候去掉指定的後綴名;
簡單案例
比如在當前目錄下,有一個叫ch1.sh的文件,使用該命令的效果如下
該命令的用途
- 遍歷某個文件目錄之後,可以使用該命令拿到該目錄下的文件名稱做後續處理;
- 拿到文件名稱之後,更改某個匹配的文件的權限等;
2、dirname
從指定文件的絕對路徑, 去除文件名,返回剩下的前綴目錄路徑
語法
dirname 文件絕對路徑
簡單案例
更多的系統函數,可以使用: declare -f 命令進行查看
自定義函數
shell編程人員可以通過自定義開發函數,實現代碼重用,提升模塊的封裝性、可讀性以及可維護性;
語法
# 函數的定義
[ function ] funname ()
{
命令
[return 返回值]}
# 調用函數
funname 傳遞參數1 傳遞參數2 …
語法說明
- 可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數;
- 參數返回,可以顯示加:return 返回,如果不加,將以最後一條命令運行結果,作為返回值, return後跟數值n(0~255);
註意點
必須在調用函數地方之前,先聲明函數再調用,shell腳本是逐行運行的, 隻有先運行瞭函數, 後面的動作才可以使用函數;
案例1:無參無返回值函數
#!/bin/bash hello(){ echo "hello func" } hello
調用下這個腳本,觀察效果展示
案例2:無參有返回值函數
#! /bin/bash function sum(){ echo "求兩個數的和..." read -p "請輸入第一個數字: " n1 read -p "請輸入第二個數字: " n2 echo "兩個數字分別為 $n1 和 $n2 " return $(($n1+$n2)) } sum echo "兩個數字的和為: $? " # 獲取函數返回值
運行上面的shell,觀察輸出效果
案例3:有參函數
在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過
$n
的形式來獲取參數的值,例如,$1
表示第一個參數,$2
表示第二個參數…
其他參數介紹
參數處理 | 說明 |
---|---|
$# | 傳遞到腳本或函數的參數個數 |
$* | 以一個單字符串顯示所有向腳本傳遞的參數 |
$$ | 腳本運行的當前進程ID號 |
$! | 後臺運行的最後一個進程的ID號 |
$@ | 與$*相同,但是使用時加引號,並在引號中返回每個參數。 |
$? | 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 |
案例介紹
使用上面的參數編寫一個輸出用戶輸入參數的示例
#!/bin/bash funParam(){ echo "第一個參數為 $1 !" echo "第二個參數為 $2 !" echo "第十個參數為 $10 !" echo "第十個參數為 ${10} !" echo "第十一個參數為 ${11} !" echo "參數總數有 $# 個!" echo "作為一個字符串輸出所有參數 $* !" } funParam 1 2 3 4 5 6 7 8 9 10 11 12 15
調用上面的腳本觀察效果
補充:Shell程序與函數的區別
函數和shell程序比較相似,區別在於:
- Shell 程序(內置命令和外部腳本文件), 外部腳本文件是在子Shell中運行, 會開啟獨立的進程運行;
- Shell函數在當前Shell的進程中運行;
linux shell編程常用案例介紹
以下結合前面關於shell編程技術點的介紹,列舉常用的一些可以使用shell編程來處理的場景
1、日志(數據)備份
比如生產環境下,為瞭保留每天的核心日志,可以使用定時任務,調度某個shell腳本,在腳本中編寫程序用於備份日志數據
參考示例
#!/bin/bash tar -zcvf log-`date +%Y-%m-%d`.tar.gz log-`date +%Y-%m-%d` /var/log
2、監控內存和磁盤容量,小於給定值時報警
當生產服務器的內存和磁盤容量不足時,可以通過編寫shell進行監控報警
參考示例
#!/bin/bash # 提取根分區剩餘空間 disk_size=$(df / | awk '/\//{print $4}') # 提取內存剩餘空間 mem_size=$(free | awk '/Mem/{print $4}') while : do # 註意內存和磁盤提取的空間大小都是以 Kb 為單位 if [ $disk_size -le 512000 -a $mem_size -le 1024000 ] then mail ‐s "Warning" root <<EOF Insufficient resources,資源不足 EOF fi done
3、查看有多少遠程 IP 連接本機
參考示例
#!/bin/bash # 查看多少遠程 IP 連接本機(不管是通過 ssh 還是 web 還是 ftp 都統計) # 使用 netstat ‐atn 可以查看本機所有連接的狀態,‐a 查看所有, # -t僅顯示 tcp 連接的信息,‐n 數字格式顯示 # Local Address(第四列是本機的 IP 和端口信息) # Foreign Address(第五列是遠程主機的 IP 和端口信息) # 使用 awk 命令僅顯示第 5 列數據,再顯示第 1 列 IP 地址的信息 # sort 可以按數字大小排序,最後使用 uniq 將多餘重復的刪除,並統計重復的次數 netstat -atn | awk '{print $5}' | awk '{print $1}' | sort -nr | uniq -c
4、編寫nginx啟動腳本
在實際的運維中,很多中間件服務,為瞭方便管理各個中間件服務,可以考慮將其做成各類啟動腳本,統一維護,下面以nginx為例說明(其他的,比如redis,zk等可以類似的參考進行編寫);
#!/bin/bash # 腳本編寫完成後,放置在/etc/init.d/目錄下,就可以被 Linux 系統自動識別到該腳本 # 如果腳本名為/etc/init.d/nginx,則 service nginx start 就可以啟動該服務 # service nginx stop 就可以關閉服務 # service nginx restart 可以重啟服務 # service nginx status 可以查看服務狀態 program=/usr/local/nginx/sbin/nginx pid=/usr/local/nginx/logs/nginx.pid start(){ if [ -f $pid ];then echo "nginx 服務已經處於開啟狀態" else $program fi stop(){ if [ -! -f $pid ];then echo "nginx 服務已經關閉" else $program -s stop echo "關閉服務 ok" fi } status(){ if [ -f $pid ];then echo "服務正在運行..." else echo "服務已經關閉" fi } case $1 in start) start;; stop) stop;; restart) stop sleep 1 start;; status) status;; *) echo "你輸入的語法格式錯誤" esac
到此這篇關於linux shell 編程之函數使用的文章就介紹到這瞭,更多相關linux shell 函數使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 入門shell腳本基礎及原理
- Nginx設置成服務並開機自動啟動的配置
- linux下shell常用腳本命令及有關知識
- Shell常用服務器日志分析命令總結
- Linux shell select菜單選擇實現代碼