函数其实就是一个名称,代表某条或某组命令。函数可以模块化程序、提高效率,甚至可以被保存在单独的文件中,需要时再被载入脚本。
如何使用函数的一些重要规则:
1、将由Bourne Shell来判断您使用的究竟是内置命令、函数,还是磁盘上的可执行程序。它先在内置命令中查找,然后是函数,最后才是可执行程序。
2、函数必须先定义,后使用;
3、函数在当前环境中运行,它可以共享所在脚本中的变量,还允许您以给位置参量赋值的方式向函数传递参数。如果在函数中使用exit命令,就会退出整个脚本。但是,如果函数的输入或输出被重定向,或者函数被括在反引号中(命令替换),shell就会创建一个子shell,函数和它的变量以及当前工作目录都只能在子shell中被识别。函数退出后,在函数中设置的所有变量都会丢失,您将回到调用函数之前所在的目录。退出函数后,您将回到脚本中函数调用时的位置。
4、return语句返回函数执行的最后一条命令的退出状态,或者返回传给它的参数,返回值不能超过255。
5、函数只能存在于定义它的shell中,不能向子shell输出。可以用dot命令来执行文件中保存的函数。
6、要列出函数和函数的定义,可以使用set命令;
7、陷阱(trap)和变量一样,被不同的函数共用。它们被脚本和脚本调用的函数共享。如果在函数中定义了一个陷阱,这个陷阱也会被脚本共享。但这种机制可能导致令人生厌的副作用。
8、如果函数存在另一个文件中,可以用dot命令(.)把它们载入当前脚本。
格式:
函数名() { 命令; 命令; }
例子:
dir ()
{
echo "Directories: ";
ls --color=tty -l | awk '/^d/ {print $NF}'
}
函数的名称是dir,函数名后那对空的圆括号只是函数命名的必要语法,没有其他目的。键入dir后shell将执行花括号里的命令。这个函数的功能是列出当前工作目录下的子目录。
注意:花括号两侧的空格是必须的。
******************************复习 开始**************************************
NF 浏览记录的域个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符
[root@centos ~]# awk '{print NF,NR,$0} END {print FILENAME}' textfile
6 1 Unusual occurrences happened at the fair.
12 2 Patty won fourth place in the 50 yard dash fair and square.
5 3 Occurrences like this are rare.
5 4 The winning ticket is 55222.
10 5 The ticket I got is 54333 and Dee got 55544.
13 6 Guy fell down while running around the south bend in his last event.
textfile
输出 域或字段数 已读的记录数 记录内容,最后输出 文件名。
[root@centos ~]# awk '{if (NR>0 && $3~/ticket/) print $0}' textfile
The winning ticket is 55222.
输出第3个域或字段是ticket的记录,或者说至少存在一条记录且第3个字段或域是ticket。
[root@centos ~]# echo $PWD | awk -F/ '{print $NF}'
root
显示当前目录名,其中$NF代表最后一个域或字段的内容。
******************************复习 结束**************************************
从内存中删除某个函数,应该使用unset命令。
格式:
unset 函数名
例子:
[root@centos ~]# unset dir
从内存中删除dir函数
函数是在当前shell中执行的,变量对函数和shell都是可见的。任何对函数中的环境所做的修改也会体现在shell中。可以使用位置参量向函数传递参数,且位置参量是函数私有的,函数对参数的操作不会影响在函数外使用的任何位置参量。
return命令可用来退出函数并将控制转回程序调用函数的位置(在脚本的任何位置使用exit,包括在函数内,都会终止脚本的运行)。
如果没有特别指定参数,函数的返回值就是函数中最后一条命令的退出状态。如果给return命令赋一个值,该值就被保存在变量?中,这个值可以是一个0 - 255之间的整数。可以用命令替换来获取函数的输出,具体做法与获取UNIX命令的输出所做的一样:把整个函数放在一对反引号之间,然后将结果赋给某个变量。
[root@centos fuhao]# more do_square
#!/bin/sh
# Scriptname: do_square
function square {
sq=`expr $1 \* $1`
echo "Number to be squared is $1."
echo "The result is $sq "
}
echo "Give me a number to square."
read number
value_returned=`square $number` # Command substitution(命令替换)
echo $value_returned
函数常被定义在.profile文件中,用户登入系统时,函数就被自动定义。函数不能被导出,但可以保存到一个文件中,当需要使用某个函数时,只要用文件名作为参数,使用dot命令(.)来调用该文件中定义的函数即可。
/root/bin/prog > more /root/fuhao/myfunctions
#!/bin/sh
# Scriptname: myfunctions
go() { # This file contains two functions
cd $HOME/bin/prog
PS1='`pwd` > ' # 将当前工作目录设置成 $HOME/bin/prog
ls
}
greetings() {
echo "Hi $1 ! Welcome to my world.";
}
定义函数的文件myfunctions
/root/bin/prog > . /root/fuhao/myfunctions
dot命令(.)将文件myfunctions的内容加载到shell的内存空间。
/root/bin/prog > greetings fuhao
Hi fuhao ! Welcome to my world.
调用函数greetings,带了参数fuhao
阅读(1405) | 评论(4) | 转发(0) |