function

所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。可以将函数看作是脚本中的一段代码,但是有一个主要区别。执行函数时,它保留当前shelll和内存信息。如果执行或调用一个脚本文件中的另一段代码,将创建一个单独的shell,因而去除所有原脚本中定义的存在变量。
函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。
格式两种
function(这个关键字可以不要) func_name(){
#函数体内容
}
函数调用:func_name parm
函数体中,可以通过$1 $2 ...$9接受函数调用中的变量
函数可以通过return 返回函数执行的结果

[ function ] funname [()]
{
    action;
    [return int;]
}

可以带function fun()  定义,也可以直接fun() 定义,不带任何参数。

参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

函数样例

[root@250-shiyan sh]# bash uu
Please input the times of print you want: 7
0
1
2
3
4
5
6
[root@250-shiyan sh]# cat uu
function LoopPrint()
{
        count=0;
        while [ $count -lt $1 ];
        do
        echo $count;
        let ++count;
        sleep 1;
        done
        return 0;
}
read -p "Please input the times of print you want: " n;   ####输入一个数字,用n表示
LoopPrint $n;  ####取n的值作为$1,以便函数内部能取到这个参数。传递参数时,(这个例子中)一定要写成LoopPrint $n;而不能写成LoopPrint n

例如你输入的是20,则n的值($n)为20,前者表示的是把n的值,即20传递给函数LoopPrint,而后者则表示把字符n传递给函数LoopPrint。

样例解释

echo $(uname);        #linux 1、定义函数可以与系统命令相同,说明shell搜索命令时候,首先会在当前的shell文件定义好的地方查找,找到直接执行。函数本质也是一个命令
declare num=1000;
uname()
{
    echo "test!";
    ((num++));
    return 100;
}
testvar()
{
    local num=10;
    ((num++));
    echo $num;
}
uname;            #test!    2、执行函数,只返回echo
echo $?            #100    3、需要获得函数值:通过$?获得
echo $num;        #1001    4、如果需要传出其它类型函数值,可以在函数调用之前,定义变量(这个就是全局变量)。在函数内部就可以直接修改,然后在执行函数就可以读出修改过的值。
testvar;             #10    5、如果需要定义自己变量,可以在函数中定义:local 变量=值 ,这时变量就是内部变量,它的修改,不会影响函数外部相同变量的值 。
echo $num;        #1001

[root@250-shiyan sh]# bash ui
Linux
test!
100
1001
11
1001

1、在/home/script/目录下新建函数文件fun-1
2、在fun-1文件中编写函数findit内容
#!/bin/bash
findit ()
{
if [ $# -lt 1 ]; then #判断函数参数个数
echo "usage: findit filename";
return 1;
fi;
for loop in "$@"; #遍历调用函数的参数
do
find /home/script/ -name $loop -print;
done;
return 0
}
3、Shell中载入函数文件
.或source /home/script/fun-1
4、检查载入文件
set
set命令将在shell中显示所有的载入函数
5、调用函数
findit mysql php #在home目录查找文件mysql和文件php

当你收集一些经常使用的函数时,可以将之放入函数文件中并将文件载入shell。
文件头应包含语句#!/bin/sh,文件名可任意选取,但最好与相关任务有某种实际联系。
一旦文件载入shell,就可以在命令行或脚本中调用函数。可以使用set命令查看所有定义的函数。输出列表包括已经载入shell的所有函数。
如果要改动函数,首先用unset命令从shell中删除函数,尽管unset删除了函数以便于此函数对于shell或脚本不可利用,但并不是真正的删除。
改动完毕后,再重新载入此文件。有些shell会识别改动,不必使用unset命令,但为了安全起见,改动函数时最好使用unset命令。
调用
同一个脚本中调用函数,只需要在调用前定义即可。
从函数文件中调用函数,这种方法不会创建另一个shell,所有函数均在当前shell下执行。
调用脚本在调用前需要载入函数文件。

/etc/init.d/functions
__sed_discard_ignored_files=`*`
init_crypto         () {}
find_crypto_mount_point     () {}
key_is_random         () {}
apply_sysctl         () {}
is_false         () {}
is_true             () {}
is_ignored_file         () {}
get_numeric_dev         () {}
confirm          () {}
strstr           () {}
action           () {}
warning          () {}
passed           () {}
failure          () {}
sucess           () {}
update_boot_stage      () {}
echo_warning          () {}
echo_passed           () {}
echo_failure          () {}
echo_sucess           () {}
status                () {}
pidofproc             () {}
pidfileofproc         () {}
killproc              () {}
daemon                () {}
__pids_pidof          () {}
__pids_var_run         () {}
__umount_loopback_loop     () {}
__umount_loop         () {}
__fgrep             () {}
__readlink            () {}
checkpid              () {}
fstab_decode_str     () {}

/etc/sysconfig/network-scripts/network-functions
get_hwaddr            () {}
get_config_by_device     () {}
get_config_by_hwaddr     () {}
get_config_by_subchannel () {}
get_config_by_name      () {}
get_device_by_hwaddr     () {}
get_uuid_by_config     () {}
need_config         () {}
source_config         () {}
ethtool_set         () {}
expand_config         () {}
toggle_value         () {}
do_netreport         () {}
is_nm_running         () {}
is_nm_active         () {}
is_nm_device_unmanaged     () {}
is_available         () {}
need_hostname         () {}
set_hostname         () {}
check_device_down     () {}
check_ethtool         () {}
check_link_down         () {}
check_default_route     () {}
find_gateway_dev     () {}
add_default_route     () {}
is_wireless_device     () {}
install_bonding_driver     () {}
is_bonding_device     () {}
change_resolv_conf     () {}
net_log             () {}

/etc/sysconfig/      每一种服务的变量定义
/etc/init.d          每一种服务的脚本
/etc/init.d/funtions 函数文件拥有所有的公用函数

有两套,一套是符号链接,一套是真实文件

符号链接

/etc/rc.local
/etc/rc.sysinit
/etc/rc
/etc/rc0.d
/etc/rc1.d
/etc/rc2.d
/etc/rc3.d
/etc/rc4.d
/etc/rc5.d
/etc/rc6.d
/etc/init.d

真实文件

/etc/rc.d/rc.local
/etc/rc.d/rc.sysinit
/etc/rc.d/rc
/etc/rc.d/rc0.d
/etc/rc.d/rc1.d
/etc/rc.d/rc2.d
/etc/rc.d/rc3.d
/etc/rc.d/rc4.d
/etc/rc.d/rc5.d
/etc/rc.d/rc6.d
/etc/rc.d/init.d

shell之函数的更多相关文章

  1. Linux操作系统shell与函数详解

    shell和函数的定义 1. linux  shell 函数 将一组命令集或语句形成一个可用的块, 这些语句块称为函数. 2. shell  函数的组成 函数名:函数名字,注意一个脚本中函数名要唯一, ...

  2. shell 中函数放回字符串问题

    shell 中函数放回字符串问题 shell 中不可以直接 return 字符串 ,可以return 数字.如果要return 字符串 改为 echo "hello world" ...

  3. shell从函数文件里调用函数

    碰到一个shell中函数调用的小问题,记录一下. shell中函数有三种调用方式,一种是在文件前面定义函数,然后在以下直接调用:一种是通过加载shell,在shell中直接调用:第三种是将函数写入文件 ...

  4. linux shell自定义函数(定义、返回值、变量作用域)介绍

    http://www.jb51.net/article/33899.htm linux shell自定义函数(定义.返回值.变量作用域)介绍 linux shell 可以用户定义函数,然后在shell ...

  5. Linux shell 自定义函数

    一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带functi ...

  6. shell脚本--函数

    shell的函数和Javacript和php的函数声明一样,只不过shell在调用函数的时候,只需要写函数名就可以调用函数,注意不要在函数名后面加括号 创建并使用函数 #!/bin/bash #文件名 ...

  7. shell进阶函数

    函数的定义和用途 函数function是由若干条shell命令组成的语句块,实现shell代码的重用和模块化编程. 函数和shell程序的异同点 它与shell程序形式上是相似的,不同的是它不是一个单 ...

  8. shell获取函数的返回值

    背景:定义了一个函数,比对本地和线上服务器集群数量差别,想要获取不同集群的个数.shell和其他语言的函数返回值还是差别挺大的.   定义一个函数 functionname(){      操作内容 ...

  9. linux shell 自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

  10. shell的函数的简单入门

    shell的函数的简单入门 语法: function funcname(){} 示例: #!/bin/bash #定义将参数转化为大写的函数 function strToUpper(){ | tr ' ...

随机推荐

  1. VS2013失去智能提示如何恢复

    一般智能提示包括,输入智能提示,鼠标移到类,方法,接口,变量上面自动提示相关信息,VS2013常常会失去这种提示功能,遇到这种情况可以这样解决: 1.在开发环境中随便打开一个xxx.aspx页面,也就 ...

  2. iOS:Size Classes的使用

    iOS 8在应用界面的可视化设计上添加了一个新的特性-Size Classes,对于任何设备来说,界面的宽度和高度都只分为两种描述:正常和紧凑.这样开发者便可以无视设备具体的尺寸,而是对这两类和它们的 ...

  3. XMLParser解析xml--内容源自网络(在静态库中不能用GDATA来解析,因为静态库不能加动态库)

    </Books> 从其文档结构我们可以看出,要定义一个Book实体类描述具体的书籍信息,其中用于存储的相关xml文档元素的实例变量与对应元素同名(本例:title.author.summa ...

  4. 步步入佳境---UI入门(3) --单视图控制器

    视图控制器特点//1,抽象  视觉上没有效果//2,负责控制视图的显示方式//3,负责通知视图的显示内容//4,ios平台赋予的,收到内存警告和检测设备旋转@interface CHViewContr ...

  5. # 20145210 《Java程序设计》第05周学习总结

    教材学习内容总结 第八章 异常处理 8.1语法与继承架构 •使用 try.catch •Java中所有信息都会被打包为对象,如果愿意,可以尝试(try)捕捉(catch)代表错误的对象后做一些处理 • ...

  6. android onConfigurationChanged讲解

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 相信大家对这个属性已经耳熟能详,如果大家受过转屏的折磨的话! 老规矩,先讲讲官方文档是怎么说的.为什 ...

  7. 清除浮动1-使用:after 伪元素

    <!doctype html><html> <head> <meta charset="UTF-8"> <meta name= ...

  8. String.Format 全汇总

    C#格式化数值结果表 字符 说明 示例 输出 C 货币 string.Format("{0:C3}", 2) $2.000 D 十进制 string.Format("{0 ...

  9. 解决magento新闻邮件发送一直处于“正在发送”状态问题

    今天在弄magento新闻邮件发送时候发现,单个邮件发送完全没有问题,但是新闻邮件订阅死活都不成功,国内国外的帖子都翻了一遍没有用,最后还是得靠自己了,于是开始慢慢找问题   首先想到是不是cront ...

  10. web.config的数据库连接字符串进行加密

    连接参考:http://wenku.baidu.com/link?url=nwGug8wxz143A4pvBE_kN6vMU7aF3ojwCKJOyN-TQleZ07iAYrjx_FnFVDOtZAF ...