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则是文件的实际大小

相关文章
相关标签/搜索