Shell函数的定义及用法

1.Shell函数

利用Shell函数为报告生成程序添加下内容

  • 输出系统正常运行时间和负载,这是自上次关机或重启之后系统的运行时长,以及在若干时间间隔内,当前运行在处理器上的平均任务量
  • 输出磁盘空间,这是系统存储设备的整体使用情况
  • 输出主目录空间,这是每个用户使用的存储空间量

如果每个任务都有对应的命令,我们可以直接通过命令替换的方式将其添加到脚本中

#!/bin/bash

#程序输出一个系统信息页

TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME="$(date +"%x %r %Z")"
TIMESTAMP="Generated $CURRENT_TIME,by $USER"


cat << _EOF_
<html>
        <head>
                <title>$TITLE</title>
    </head>
    <body>
                <h1>$TITLE</h1>
                <P>$TIMESTAMP</p>
                $(report_uptime)
                $(report_disk_space)
                $(report_home_space)
    </body>
</html>
_EOF_

可以通过两种方式创建这些额外的命令,1)要么编写三个独立的脚本,放置在PATH所列出的目录中;要么将脚本作为Shell函数嵌入程序中。Shell函数就是位于其他脚本内的“迷你脚本”,可用作自主程序。Shell程序有两种语法形式,

  1. 一种比较正式

     function name {
     	commands
     	return
     }
    
  2. 另一种比较简单(首选)

     name () {
     	commands
     	return
     }
    

Shell读取脚本时,先跳过注释行及函数所在行。当执行到调用函数所在行时,在转移到前面定义函数的行。注意,为了让函数调用能够被识别为Shell函数,不被解释为外部程序名称,Shell函数的定义在脚本中必须出现在调用之前。

在前面的脚本中添加了函数的定义:

#!/bin/bash

#程序输出一个系统信息页

TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME="$(date +"%x %r %Z")"
TIMESTAMP="Generated $CURRENT_TIME,by $USER"

report_uptime () {
    return
}

report_disk_space () {
    return
}

report_home_space () {
    return
}


cat << _EOF_
<html>
    <head>
        <title>$TITLE</title>
    </head>
    <body>
        <h1>$TITLE</h1>
        <P>$TIMESTAMP</p>
        $(report_uptime)
        $(report_disk_space)
        $(report_home_space)
    </body>
</html>
_EOF_

2.局部变量

目前所编写的脚本中,所有的变量都是全局变量。整个程序执行期间,全局变量一直存在。有时候,它会使Shell函数的使用变得复杂起来。在Shell函数内部,往往更需要局部变量。局部变量只能在定义其的Shell函数中有效,一旦Shell函数终止,就不复存在。

局部变量允许程序员使用已经存在的变量名,无论这些变量名表示脚本中的全局变量,还是其他Shell函数中的变量,都不用担心潜在的命名冲突。

局部变量通过在变量名之前添加单词local来定义,所创建出的变量在其定义的Shell函数内部是局部变量。在Shell函数外部,这个变量就不存在了。

#!/bin/bash

foo=0  #global variable foo

funct_1 () {
        local foo
        foo=1
        echo "funct_1: foo=$foo"
}


funct_2 () {
        local foo
        foo=2
        echo "funct_2: foo=$foo"
}

echo "global: foo=$foo"
funct_1
echo "global: foo=$foo"
funct_2
echo "global: foo=$foo"

脚本的执行结果:

[root@REAL01 bin]# localvars
global: foo=0
funct_1: foo=1
global: foo=0
funct_2: foo=2
global: foo=0

3.保持脚本可执行

脚本中添加一些提示代码,可以早期发现程序的逻辑流程,上述程序修改为:

#!/bin/bash

#程序输出一个系统信息页

TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME="$(date +"%x %r %Z")"
TIMESTAMP="Generated $CURRENT_TIME,by $USER"

report_uptime () {
    echo "Function report_uptime excuted."
    return
}

report_disk_space () {
    echo "Function report_disk_space excuted."
    return
}

report_home_space () {
    echo "Function report_home_space excuted."
    return
}


cat << _EOF_
<html>
    <head>
        <title>$TITLE</title>
    </head>
    <body>
        <h1>$TITLE</h1>
        <P>$TIMESTAMP</p>
        $(report_uptime)
        $(report_disk_space)
        $(report_home_space)
    </body>
</html>
_EOF_

1.接下来完善report_uptime

report_uptime () {
    cat <<- _EOF_
        <h2>System Uptime</h2>
        <pre>$(uptime)</pre>
        _EOF_
    return
}

$(uptime)两边的

标签用于保留该命令的格式,report_disk_space函数也类似:

report_disk_space () {
    cat <<- _EOF_
        <h2>Disk Space Utilization</h2>
        <pre>$(df -h)</pre>
        _EOF_
    return
}

report_home_space函数:

report_home_space () {
    cat <<- _EOF_
        <h2>Home Space Utilization</h2>
        <pre>$(du -sh /home/*)</pre>
        _EOF_
    return
}

.bashrc文件中的Shell函数
Shell函数是别名的较好替代,实际上也是创建供个人使用的轻量级命令的首选方法。别名受限于其所支持的命令类型和Shell特性,而任何只要能写进脚本的内容,Shell函数都支持。例如,如果我们觉得脚本所编写的Shell函数report_disk_space还不错,则可以为.bashrc文件创建一个类似ds的函数:
ds () {
echo “Disk Space Utilization For $HOSTNAME”
df -h
}

猜你喜欢

转载自blog.csdn.net/weixin_43770382/article/details/127722973