<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用linux的shell程式設計,可以說函數是非常重要的內容,也是在編寫各類shell指令碼的時候經常用到的,本篇將介紹下函數相關的使用。
系統函數為linux自帶的函數, 可以在shell編寫中直接使用。下面介紹幾種常用的系統函數
用於獲取檔名函數, 根據給出的檔案路徑擷取出檔名;
basename [string / pathname] [suffix]
比如在當前目錄下,有一個叫ch1.sh的檔案,使用該命令的效果如下
該命令的用途
從指定檔案的絕對路徑, 去除檔名,返回剩下的字首目錄路徑
dirname 檔案絕對路徑
更多的系統函數,可以使用: declare -f 命令進行檢視
shell程式設計人員可以通過自定義開發函數,實現程式碼重用,提升模組的封裝性、可讀性以及可維護性;
# 函數的定義
[ function ] funname ()
{
命令
[return 返回值]}
# 呼叫函數
funname 傳遞引數1 傳遞引數2 ...
必須在呼叫函數地方之前,先宣告函數再呼叫,shell指令碼是逐行執行的, 只有先執行了函數, 後面的動作才可以使用函數;
#!/bin/bash hello(){ echo "hello func" } hello
呼叫下這個指令碼,觀察效果展示
#! /bin/bash function sum(){ echo "求兩個數的和..." read -p "請輸入第一個數位: " n1 read -p "請輸入第二個數位: " n2 echo "兩個數位分別為 $n1 和 $n2 " return $(($n1+$n2)) } sum echo "兩個數位的和為: $? " # 獲取函數返回值
執行上面的shell,觀察輸出效果
在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指令碼,在指令碼中編寫程式用於備份紀錄檔資料
參考範例
#!/bin/bash tar -zcvf log-`date +%Y-%m-%d`.tar.gz log-`date +%Y-%m-%d` /var/log
當生產伺服器的記憶體和磁碟容量不足時,可以通過編寫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
參考範例
#!/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
在實際的運維中,很多中介軟體服務,為了方便管理各個中介軟體服務,可以考慮將其做成各類啟動指令碼,統一維護,下面以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 函數使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45