亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

linux?shell?編程之函數(shù)使用詳解

 更新時間:2022年10月28日 11:01:31   作者:逆風飛翔的小叔  
使用linux的shell編程,可以說函數(shù)是非常重要的內(nèi)容,也是在編寫各類shell腳本的時候經(jīng)常用到的,這篇文章主要介紹了linux?shell?編程之函數(shù)使用,需要的朋友可以參考下

前言

使用linux的shell編程,可以說函數(shù)是非常重要的內(nèi)容,也是在編寫各類shell腳本的時候經(jīng)常用到的,本篇將介紹下函數(shù)相關(guān)的使用。

shell 函數(shù)分類

  • 系統(tǒng)函數(shù)
  • 自定義函數(shù)

系統(tǒng)函數(shù)

系統(tǒng)函數(shù)為linux自帶的函數(shù), 可以在shell編寫中直接使用。下面介紹幾種常用的系統(tǒng)函數(shù)

1、basename

用于獲取文件名函數(shù), 根據(jù)給出的文件路徑截取出文件名;

語法

basename [string / pathname] [suffix]  

  • 根據(jù)根據(jù)指定字符串或路徑名進行截取文件名, 比如: 根據(jù)路徑"/root/shells/aa.txt", 可以截取出aa.txt;
  • suffix: 用于截取的時候去掉指定的后綴名;

簡單案例

比如在當前目錄下,有一個叫ch1.sh的文件,使用該命令的效果如下

該命令的用途

  • 遍歷某個文件目錄之后,可以使用該命令拿到該目錄下的文件名稱做后續(xù)處理;
  • 拿到文件名稱之后,更改某個匹配的文件的權(quán)限等;

2、dirname

從指定文件的絕對路徑, 去除文件名,返回剩下的前綴目錄路徑

語法

dirname 文件絕對路徑

簡單案例

更多的系統(tǒng)函數(shù),可以使用: declare -f 命令進行查看

自定義函數(shù)

shell編程人員可以通過自定義開發(fā)函數(shù),實現(xiàn)代碼重用,提升模塊的封裝性、可讀性以及可維護性;

語法

# 函數(shù)的定義
[ function ] funname ()
{
    命令
    [return 返回值]

}

# 調(diào)用函數(shù)
funname 傳遞參數(shù)1 傳遞參數(shù)2 ...

語法說明

  • 可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數(shù);
  • 參數(shù)返回,可以顯示加:return 返回,如果不加,將以最后一條命令運行結(jié)果,作為返回值, return后跟數(shù)值n(0~255);

注意點

必須在調(diào)用函數(shù)地方之前,先聲明函數(shù)再調(diào)用,shell腳本是逐行運行的, 只有先運行了函數(shù), 后面的動作才可以使用函數(shù);

案例1:無參無返回值函數(shù)

#!/bin/bash
hello(){
        echo "hello func"
}
hello

調(diào)用下這個腳本,觀察效果展示

案例2:無參有返回值函數(shù)

#! /bin/bash
function sum(){
    echo "求兩個數(shù)的和..."
    read -p "請輸入第一個數(shù)字: " n1
    read -p "請輸入第二個數(shù)字: " n2
    echo "兩個數(shù)字分別為 $n1 和 $n2 "
    return $(($n1+$n2))
}
sum
echo "兩個數(shù)字的和為: $? "  # 獲取函數(shù)返回值

運行上面的shell,觀察輸出效果

案例3:有參函數(shù)

在Shell中,調(diào)用函數(shù)時可以向其傳遞參數(shù)。在函數(shù)體內(nèi)部,通過 $n 的形式來獲取參數(shù)的值,例如,$1 表示第一個參數(shù),$2 表示第二個參數(shù)...

其他參數(shù)介紹

參數(shù)處理說明
$#傳遞到腳本或函數(shù)的參數(shù)個數(shù)
$*以一個單字符串顯示所有向腳本傳遞的參數(shù)
$$腳本運行的當前進程ID號
$!后臺運行的最后一個進程的ID號
$@與$*相同,但是使用時加引號,并在引號中返回每個參數(shù)。
$?顯示最后命令的退出狀態(tài)。0表示沒有錯誤,其他任何值表明有錯誤。

案例介紹

使用上面的參數(shù)編寫一個輸出用戶輸入?yún)?shù)的示例

#!/bin/bash
funParam(){
    echo "第一個參數(shù)為 $1 !"
    echo "第二個參數(shù)為 $2 !"
    echo "第十個參數(shù)為 $10 !"
    echo "第十個參數(shù)為 ${10} !"
    echo "第十一個參數(shù)為 ${11} !"
    echo "參數(shù)總數(shù)有 $# 個!"
    echo "作為一個字符串輸出所有參數(shù) $* !"
}
 
funParam 1 2 3 4 5 6 7 8 9 10 11 12 15

調(diào)用上面的腳本觀察效果

補充:Shell程序與函數(shù)的區(qū)別

函數(shù)和shell程序比較相似,區(qū)別在于:

  • Shell 程序(內(nèi)置命令和外部腳本文件), 外部腳本文件是在子Shell中運行, 會開啟獨立的進程運行;
  • Shell函數(shù)在當前Shell的進程中運行;

linux shell編程常用案例介紹

以下結(jié)合前面關(guān)于shell編程技術(shù)點的介紹,列舉常用的一些可以使用shell編程來處理的場景

1、日志(數(shù)據(jù))備份

比如生產(chǎn)環(huán)境下,為了保留每天的核心日志,可以使用定時任務,調(diào)度某個shell腳本,在腳本中編寫程序用于備份日志數(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)存和磁盤容量,小于給定值時報警

當生產(chǎn)服務器的內(nèi)存和磁盤容量不足時,可以通過編寫shell進行監(jiān)控報警

參考示例

#!/bin/bash  
# 提取根分區(qū)剩余空間  
disk_size=$(df / | awk '/\//{print $4}')  
  
# 提取內(nèi)存剩余空間  
mem_size=$(free | awk '/Mem/{print $4}')  
while :  
do  
# 注意內(nèi)存和磁盤提取的空間大小都是以 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 都統(tǒng)計)   
# 使用 netstat ‐atn 可以查看本機所有連接的狀態(tài),‐a 查看所有,  
# -t僅顯示 tcp 連接的信息,‐n 數(shù)字格式顯示  
# Local Address(第四列是本機的 IP 和端口信息)  
# Foreign Address(第五列是遠程主機的 IP 和端口信息)  
# 使用 awk 命令僅顯示第 5 列數(shù)據(jù),再顯示第 1 列 IP 地址的信息  
# sort 可以按數(shù)字大小排序,最后使用 uniq 將多余重復的刪除,并統(tǒng)計重復的次數(shù)  
 
netstat -atn  |  awk  '{print $5}'  | awk  '{print $1}' | sort -nr  |  uniq -c  

4、編寫nginx啟動腳本

在實際的運維中,很多中間件服務,為了方便管理各個中間件服務,可以考慮將其做成各類啟動腳本,統(tǒng)一維護,下面以nginx為例說明(其他的,比如redis,zk等可以類似的參考進行編寫);

#!/bin/bash  
  
# 腳本編寫完成后,放置在/etc/init.d/目錄下,就可以被 Linux 系統(tǒng)自動識別到該腳本  
# 如果腳本名為/etc/init.d/nginx,則 service nginx start 就可以啟動該服務  
# service nginx stop 就可以關(guān)閉服務  
# service nginx restart 可以重啟服務  
# service nginx status 可以查看服務狀態(tài)  
program=/usr/local/nginx/sbin/nginx  
pid=/usr/local/nginx/logs/nginx.pid  
start(){  
if [ -f $pid ];then  
  echo  "nginx 服務已經(jīng)處于開啟狀態(tài)"  
else  
  $program  
fi  
stop(){  
if [ -! -f $pid ];then  
  echo "nginx 服務已經(jīng)關(guān)閉"  
else  
  $program -s stop  
  echo "關(guān)閉服務 ok"  
fi  
}  
status(){  
if [ -f $pid ];then  
  echo "服務正在運行..."  
else  
  echo "服務已經(jīng)關(guān)閉"  
fi  
}  
  
case $1 in  
start)  
  start;;  
stop)  
  stop;;  
restart)  
  stop  
  sleep 1  
  start;;  
status)  
  status;;  
*)  
  echo  "你輸入的語法格式錯誤"  
esac  

到此這篇關(guān)于linux shell 編程之函數(shù)使用的文章就介紹到這了,更多相關(guān)linux shell 函數(shù)使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論