Chinaunix首页 | 论坛 | 博客
  • 博客访问: 194991
  • 博文数量: 49
  • 博客积分: 1959
  • 博客等级: 上尉
  • 技术积分: 492
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-08 16:23
文章分类

全部博文(49)

文章存档

2012年(8)

2011年(34)

2008年(7)

分类:

2011-05-22 16:00:56

函数其实就是一个名称,代表某条或某组命令。函数可以模块化程序、提高效率,甚至可以被保存在单独的文件中,需要时再被载入脚本。
如何使用函数的一些重要规则:
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) |
给主人留下些什么吧!~~

fuowen202011-07-01 18:16:34

OFS 输出字段分隔符、ORS 输出记录分隔符

fuowen202011-07-01 17:58:13

RS 记录分隔符变量。RS 变量告诉 awk 当前记录什么时候结束,新记录什么时候开始。

fuowen202011-07-01 17:55:45

字段或域数量 NF;记录号 NR

fuowen202011-07-01 17:51:04

字段或域分隔符 FS,FS 值并没有被限制为单一字符;可以通过指定任意长度的字符模式,将它设置成规则表达式。缺省情况下,FS 设置成单一空格字符。