10.3函數及腳本的綜合應用

函數及腳本的綜合應用linux

一 shell函數shell

shell函數:shell容許將一組命令集或語句造成一個可用塊,這些塊稱爲shell函數bash

函數由兩部分組成:函數標題、函數體;標題是函數名;函數體是函數內的命令集合;標題名應該惟一;若是不是,將會混淆結果,由於腳本在查看調用腳本前將首先搜索函數調用相應的shellide

定義函數的格式爲:函數

函數名(){測試

命令1this

...spa

}日誌

若是願意,可在函數名前加上關鍵字function,這取決於使用者。blog

function函數名()

{

命令1

...

}

應用

例1:刪除文件中的空行

這個腳本(腳本名爲del.lines)能夠處理一個或多個文件。每一個文件在用sed刪除空行以前要先覈實是否存在。

sed的輸出被導入一個文件名中含有$ $的臨時文件,最後這個臨時文件又被移回到原來的文件中。

該腳本使用shift命令取得全部的文件名,用while循環逐個處理全部的文件,直至處理完爲止。可使用del.lines --help得到一個簡短的幫助

#!/bin/bash

TEMP_F="/tmp/del.lines.$$"

#定義函數

usage()

{

#提示腳本運行格式並查看幫助信息

    echo "Usage:`basename $0` file [file...]"

    echo "try `basename $0` -help for more info"

    exit 1

}

#若是腳本後面的參數個數爲0,即沒有參數

if [ $# -eq 0 ]

then

#則提示函數裏的內容

    usage

fi

while [ $# -gt 0 ]

do

#提示正在執行的是位置1的參數

    echo "...$1"

#若是位置1的參數時--help,則顯示幫助信息

    case $1 in

    --help)

        echo "Use this script to delete all blank lines from a text file(s)"

    exit 0

    ;;

    *)

    FILE_NAME=$1

#判斷位置1的文件是否存在

    if [ -f $1 ]

    then

#刪除源文件內的空行(不是空格鍵的空行),並生成新的文件

        sed '/^$/d' $FILE_NAME > $TEMP_F

        mv $TEMP_F $FILE_NAME

    else

        echo "$0 cannot find this file: $1"

    fi

#將 $1~$9 依次向左傳遞

    shift

    ;;

    esac

done

保存後給腳本文件增長執行權限:chmod +x del.lines

執行腳本進行測試:

注:

一、basename命令可以從路徑中分離出文件名。一般用於shell腳本中

二、shift語句用於遷移位置變量,將 $1~$9 依次向左傳遞

例如,若當前腳本程序得到的位置變量以下:

$1=file一、$2=file二、$3=file三、$4=file4

則執行一次shift命令後,各位置變量爲:

$1=file二、$2=file三、$3=file4

再次執行shift命令後,各位置變量爲:

$1=file三、$2=file4

例2:若是某些日誌文件超過了特定的長度(如8K),那麼它的內容將被倒換到另外一個文件中,並清除原有文件中的內容.

系統中的有些日誌文件增加十分迅速,天天手工檢查這些日誌文件的長度並倒換這些日誌文件(一般是給文件名加個時間戳)是很是乏味的。能夠編寫一個腳原本自動完成這項工做。該腳本將提交給cron進程來運行,若是某個日誌文件超過了特定的長度,那麼它的內容將被倒換到另外一個文件中,並清除原有文件中的內容。

該腳本中日誌文件的長度限制是由變量BLOCK_LIMIT設定的。這一數字表明瞭塊數目,在本例中是8(塊大小默認爲4K)。能夠按照本身的需求把這一數字設得更高。全部要檢查的日誌文件名都保存在變量LOGS中。

這裏使用了一個for循環來依次檢查每個日誌文件,使用du命令來獲取日誌文件長度。

若是相應的文件長度大於BLOCK_LIMIT變量所規定的值,那麼該文件將被拷貝到一個文件

名含有時間戳的文件中,原先的文件長度將被截斷爲0。

#!/bin/bash

BLOCK_LIMIT=8

MYDATE=$(date +%d%m)

#定義文件列表集合

LOGS="/var/log/maillog /var/log/messages"

for LOG_FILE in $LOGS

do

    if [ -f $LOG_FILE ]

    then

        F_SIZE=$(du -a $LOG_FILE | awk '{print $1}')

    else

        echo "$0 connot find $LOG_FILE"

#文件不存在,直接不用執行下面的語句從新開始循環

        continue

    fi

    if [ "$F_SIZE" -gt "$BLOCK_LIMIT" ]

    then

        cp $LOG_FILE $LOG_FILE$MYDATE

#清空原來的文件內容

        >$LOG_FILE

    fi

done

注:du 並非顯示文件的實際大小,而是顯示文件所佔用的 block 大小,默認linux系統分區的 block size 是4k,也就是說即便文件只有1個字節,也會佔用4k. ls -l則是文件的實際大小

相關文章
相關標籤/搜索