shell学习之函数与库(一)
函数堪称shell的精华,有了函数和库,shell处理复杂问题也像编译语言那样有头有脸了,总之,shell的函数和库的重要性不言而喻。
1 函数的定义
建议使用
FUNC_NAME (){}的定义方法
有些人可能喜欢在前面加上function标记,这是bash独有的
function FUNC_NAME(){}
有点是简洁,容易识别是函数
2 函数返回值
一般可以用
①在函数中,return 返回
②调用函数,通过命令引用 比如 a=`func_name haha`
3 书上的一个小例子,计算1-6的二次方,三次方
[root@www shell]# cat square-cube.sh
#!/bin/bash
#
txt="_mktmp"
square_cube()
{
echo "$2 * $2"|bc > $1
echo "$2 * $2 * $2"|bc >> $1
}
for i in `seq 1 5`
do
square_cube $txt $i
square=`head -1 $txt`
cube=`tail -1 $txt`
echo "square of $i is $square"
echo "cube of $i is $cube"
done
rm -f $txt
执行结果:
[root@www shell]# ./square-cube.sh
square of 1 is 1
cube of 1 is 1
square of 2 is 4
cube of 2 is 8
square of 3 is 9
cube of 3 is 27
square of 4 is 16
cube of 4 is 64
square of 5 is 25
cube of 5 is 125
总结下:这里是一个很简单的函数调用,函数的功能就是处理办理计算结果保存在特定位置,主脚本负责控制流程
tips:1和l很相似,大家要注意,害的我浪费了时间
4 debugger脚本
[root@www shell]# cat debugger.sh
#!/bin/bash
#
#this a debugger by function
LOGFILE=/tmp/log.log
#指定脚本名
APPNAME=$0
#指定DEBUG级别,越高就显示越多的冗余信息
VERBOSE=10
#logmsg负责显示传递给它的消息
logmsg()
{
echo "$APPNAME:`date`--entered---$@" >> $LOGFILE
}
#debug负责显示错误/调试 信息
debug()
{
verbosity=$1
#shift的目的在于把级别挪走,以便只显示debug信息
shift
if [ "$verbosity" -le "$VERBOSE" ] ;then
echo "$APPNAME:`date`---level:${verbosity}---:$@" >> $LOGFILE
fi
}
#die函数你懂得
die(){
echo "$APPNAME:`date`----fatal error--$@"
exit 1
}
#主脚本测试
#显示脚本开始,好像有点多余哈
logmsg now the log-checking system start -------
#测试uname -a命令是否存在
uname -a||die uname -a command not find.
#uname存在的话,继续执行
logmsg -----------system-info`uname -a`
#判断是redhat或者debian系统
cat /etc/redhat-release||debug 8 this is not a redhat system!
cat /etc/debian-release||debug 8 this is not a debian system!
#书上更多点,我这里省略了一些,为了简洁
运行结果
[root@www shell]# ./debugger.sh
Linux www.centos.vbird 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
CentOS release 6.4 (Final)
cat: /etc/debian-release: No such file or directory
总结下,这里三个函数互相协调使用,有撤销的,有报错的,注意$@指全部参数,$0指文件名,$1指第一个参数,等,这些如果不知道的话得恶补啦
5 递归函数举例
典型a:计算阶乘
[root@www shell]# cat factorial.sh
#!/bin/bash
#
factorial(){
if [ "$1" -gt "1" ];then
previous=`expr $1 - 1`
parent=`factorial $previous`
result=`expr $1 \* $parent`
echo $result
else
echo 1
fi
}
factorial $1
执行结果:
[root@www shell]# sh -x factorial.sh 3
+ factorial 3
+ ‘[‘ 3 -gt 1 ‘]‘ ;;判断是否是1
++ expr 3 - 1
+ previous=2
++ factorial 2 ;;由于parent=`factorial $previous`在函数中调用了该函数,所以是递归
++ ‘[‘ 2 -gt 1 ‘]‘
+++ expr 2 - 1
++ previous=1
+++ factorial 1
+++ ‘[‘ 1 -gt 1 ‘]‘
+++ echo 1
++ parent=1 ;;最后知道初始条件为1的阶乘为1
+++ expr 2 ‘*‘ 1
++ result=2
++ echo 2
+ parent=2
++ expr 3 ‘*‘ 2
+ result=6
+ echo 6
6
可以算大的数,就是慢…
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。