linux?shell?編程之函數(shù)使用詳解
前言
使用linux的shell編程,可以說(shuō)函數(shù)是非常重要的內(nèi)容,也是在編寫(xiě)各類(lèi)shell腳本的時(shí)候經(jīng)常用到的,本篇將介紹下函數(shù)相關(guān)的使用。
shell 函數(shù)分類(lèi)
- 系統(tǒng)函數(shù)
- 自定義函數(shù)
系統(tǒng)函數(shù)
系統(tǒng)函數(shù)為linux自帶的函數(shù), 可以在shell編寫(xiě)中直接使用。下面介紹幾種常用的系統(tǒng)函數(shù)
1、basename
用于獲取文件名函數(shù), 根據(jù)給出的文件路徑截取出文件名;
語(yǔ)法
basename [string / pathname] [suffix]
- 根據(jù)根據(jù)指定字符串或路徑名進(jìn)行截取文件名, 比如: 根據(jù)路徑"/root/shells/aa.txt", 可以截取出aa.txt;
- suffix: 用于截取的時(shí)候去掉指定的后綴名;
簡(jiǎn)單案例
比如在當(dāng)前目錄下,有一個(gè)叫ch1.sh的文件,使用該命令的效果如下

該命令的用途
- 遍歷某個(gè)文件目錄之后,可以使用該命令拿到該目錄下的文件名稱(chēng)做后續(xù)處理;
- 拿到文件名稱(chēng)之后,更改某個(gè)匹配的文件的權(quán)限等;
2、dirname
從指定文件的絕對(duì)路徑, 去除文件名,返回剩下的前綴目錄路徑
語(yǔ)法
dirname 文件絕對(duì)路徑
簡(jiǎn)單案例
![]()
更多的系統(tǒng)函數(shù),可以使用: declare -f 命令進(jìn)行查看
自定義函數(shù)
shell編程人員可以通過(guò)自定義開(kāi)發(fā)函數(shù),實(shí)現(xiàn)代碼重用,提升模塊的封裝性、可讀性以及可維護(hù)性;
語(yǔ)法
# 函數(shù)的定義
[ function ] funname ()
{
命令
[return 返回值]}
# 調(diào)用函數(shù)
funname 傳遞參數(shù)1 傳遞參數(shù)2 ...
語(yǔ)法說(shuō)明
- 可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數(shù);
- 參數(shù)返回,可以顯示加:return 返回,如果不加,將以最后一條命令運(yùn)行結(jié)果,作為返回值, return后跟數(shù)值n(0~255);
注意點(diǎn)
必須在調(diào)用函數(shù)地方之前,先聲明函數(shù)再調(diào)用,shell腳本是逐行運(yùn)行的, 只有先運(yùn)行了函數(shù), 后面的動(dòng)作才可以使用函數(shù);
案例1:無(wú)參無(wú)返回值函數(shù)
#!/bin/bash
hello(){
echo "hello func"
}
hello調(diào)用下這個(gè)腳本,觀察效果展示

案例2:無(wú)參有返回值函數(shù)
#! /bin/bash
function sum(){
echo "求兩個(gè)數(shù)的和..."
read -p "請(qǐng)輸入第一個(gè)數(shù)字: " n1
read -p "請(qǐng)輸入第二個(gè)數(shù)字: " n2
echo "兩個(gè)數(shù)字分別為 $n1 和 $n2 "
return $(($n1+$n2))
}
sum
echo "兩個(gè)數(shù)字的和為: $? " # 獲取函數(shù)返回值運(yùn)行上面的shell,觀察輸出效果

案例3:有參函數(shù)
在Shell中,調(diào)用函數(shù)時(shí)可以向其傳遞參數(shù)。在函數(shù)體內(nèi)部,通過(guò)
$n的形式來(lái)獲取參數(shù)的值,例如,$1表示第一個(gè)參數(shù),$2表示第二個(gè)參數(shù)...
其他參數(shù)介紹
| 參數(shù)處理 | 說(shuō)明 |
|---|---|
| $# | 傳遞到腳本或函數(shù)的參數(shù)個(gè)數(shù) |
| $* | 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù) |
| $$ | 腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào) |
| $! | 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào) |
| $@ | 與$*相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)。 |
| $? | 顯示最后命令的退出狀態(tài)。0表示沒(méi)有錯(cuò)誤,其他任何值表明有錯(cuò)誤。 |
案例介紹
使用上面的參數(shù)編寫(xiě)一個(gè)輸出用戶輸入?yún)?shù)的示例
#!/bin/bash
funParam(){
echo "第一個(gè)參數(shù)為 $1 !"
echo "第二個(gè)參數(shù)為 $2 !"
echo "第十個(gè)參數(shù)為 $10 !"
echo "第十個(gè)參數(shù)為 ${10} !"
echo "第十一個(gè)參數(shù)為 ${11} !"
echo "參數(shù)總數(shù)有 $# 個(gè)!"
echo "作為一個(gè)字符串輸出所有參數(shù) $* !"
}
funParam 1 2 3 4 5 6 7 8 9 10 11 12 15調(diào)用上面的腳本觀察效果

補(bǔ)充:Shell程序與函數(shù)的區(qū)別
函數(shù)和shell程序比較相似,區(qū)別在于:
- Shell 程序(內(nèi)置命令和外部腳本文件), 外部腳本文件是在子Shell中運(yùn)行, 會(huì)開(kāi)啟獨(dú)立的進(jìn)程運(yùn)行;
- Shell函數(shù)在當(dāng)前Shell的進(jìn)程中運(yùn)行;
linux shell編程常用案例介紹
以下結(jié)合前面關(guān)于shell編程技術(shù)點(diǎn)的介紹,列舉常用的一些可以使用shell編程來(lái)處理的場(chǎng)景
1、日志(數(shù)據(jù))備份
比如生產(chǎn)環(huán)境下,為了保留每天的核心日志,可以使用定時(shí)任務(wù),調(diào)度某個(gè)shell腳本,在腳本中編寫(xiě)程序用于備份日志數(shù)據(jù)

參考示例
#!/bin/bash tar -zcvf log-`date +%Y-%m-%d`.tar.gz log-`date +%Y-%m-%d` /var/log
2、監(jiān)控內(nèi)存和磁盤(pán)容量,小于給定值時(shí)報(bào)警
當(dāng)生產(chǎn)服務(wù)器的內(nèi)存和磁盤(pán)容量不足時(shí),可以通過(guò)編寫(xiě)shell進(jìn)行監(jiān)控報(bào)警
參考示例
#!/bin/bash
# 提取根分區(qū)剩余空間
disk_size=$(df / | awk '/\//{print $4}')
# 提取內(nèi)存剩余空間
mem_size=$(free | awk '/Mem/{print $4}')
while :
do
# 注意內(nèi)存和磁盤(pán)提取的空間大小都是以 Kb 為單位
if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]
then
mail ‐s "Warning" root <<EOF
Insufficient resources,資源不足
EOF
fi
done 3、查看有多少遠(yuǎn)程 IP 連接本機(jī)
參考示例
#!/bin/bash
# 查看多少遠(yuǎn)程 IP 連接本機(jī)(不管是通過(guò) ssh 還是 web 還是 ftp 都統(tǒng)計(jì))
# 使用 netstat ‐atn 可以查看本機(jī)所有連接的狀態(tài),‐a 查看所有,
# -t僅顯示 tcp 連接的信息,‐n 數(shù)字格式顯示
# Local Address(第四列是本機(jī)的 IP 和端口信息)
# Foreign Address(第五列是遠(yuǎn)程主機(jī)的 IP 和端口信息)
# 使用 awk 命令僅顯示第 5 列數(shù)據(jù),再顯示第 1 列 IP 地址的信息
# sort 可以按數(shù)字大小排序,最后使用 uniq 將多余重復(fù)的刪除,并統(tǒng)計(jì)重復(fù)的次數(shù)
netstat -atn | awk '{print $5}' | awk '{print $1}' | sort -nr | uniq -c 4、編寫(xiě)nginx啟動(dòng)腳本
在實(shí)際的運(yùn)維中,很多中間件服務(wù),為了方便管理各個(gè)中間件服務(wù),可以考慮將其做成各類(lèi)啟動(dòng)腳本,統(tǒng)一維護(hù),下面以nginx為例說(shuō)明(其他的,比如redis,zk等可以類(lèi)似的參考進(jìn)行編寫(xiě));
#!/bin/bash
# 腳本編寫(xiě)完成后,放置在/etc/init.d/目錄下,就可以被 Linux 系統(tǒng)自動(dòng)識(shí)別到該腳本
# 如果腳本名為/etc/init.d/nginx,則 service nginx start 就可以啟動(dòng)該服務(wù)
# service nginx stop 就可以關(guān)閉服務(wù)
# service nginx restart 可以重啟服務(wù)
# service nginx status 可以查看服務(wù)狀態(tài)
program=/usr/local/nginx/sbin/nginx
pid=/usr/local/nginx/logs/nginx.pid
start(){
if [ -f $pid ];then
echo "nginx 服務(wù)已經(jīng)處于開(kāi)啟狀態(tài)"
else
$program
fi
stop(){
if [ -! -f $pid ];then
echo "nginx 服務(wù)已經(jīng)關(guān)閉"
else
$program -s stop
echo "關(guān)閉服務(wù) ok"
fi
}
status(){
if [ -f $pid ];then
echo "服務(wù)正在運(yùn)行..."
else
echo "服務(wù)已經(jīng)關(guān)閉"
fi
}
case $1 in
start)
start;;
stop)
stop;;
restart)
stop
sleep 1
start;;
status)
status;;
*)
echo "你輸入的語(yǔ)法格式錯(cuò)誤"
esac 到此這篇關(guān)于linux shell 編程之函數(shù)使用的文章就介紹到這了,更多相關(guān)linux shell 函數(shù)使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
輸出執(zhí)行操作和打印日志的shell腳本實(shí)例
下面小編就為大家?guī)?lái)一篇輸出執(zhí)行操作和打印日志的shell腳本實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
Shell腳本實(shí)現(xiàn)的一個(gè)簡(jiǎn)易Web服務(wù)器例子分享
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)的一個(gè)簡(jiǎn)易Web服務(wù)器例子分享,本文實(shí)現(xiàn)的Web服務(wù)器非常簡(jiǎn)單實(shí)用,可以在你不想安裝nginx、apache等大型WEB服務(wù)器時(shí)使用,需要的朋友可以參考下2014-12-12
linux下passwd命令設(shè)置修改用戶密碼的方法
下面小編就為大家?guī)?lái)一篇linux下passwd命令設(shè)置修改用戶密碼的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
linux shell腳本對(duì)未定義變量的判斷以及if的用法詳解
今天小編就為大家分享一篇linux shell腳本對(duì)未定義變量的判斷以及if的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
用shell+sendmail實(shí)現(xiàn)服務(wù)器監(jiān)控報(bào)警小腳本
用shell+sendmail寫(xiě)的服務(wù)器監(jiān)控報(bào)警小腳本,有需要的朋友可以參考下2013-03-03
Shell腳本實(shí)現(xiàn)批量下載網(wǎng)絡(luò)圖片代碼分享
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)批量下載網(wǎng)絡(luò)圖片代碼分享,本文基于下載Yahoo天氣圖標(biāo)而寫(xiě),圖片地址需有一定的規(guī)則,需要的朋友可以參考下2014-09-09

