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程序有两种语法形式,
-
一种比较正式
function name { commands return }
-
另一种比较简单(首选)
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
}