码迷,mamicode.com
首页 > 系统相关 > 详细

shell学习三十一天----函数问题

时间:2015-06-28 15:41:23      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:shell

函数

案例一:

#!/bin/bash

hello () {

        echo "hahahah"

}

hello

 

执行函数,结果为:hahaha

 

 

案例二:

#!/bin/bash

funWithReturn()

{

        echo "the function is to get the sum of two number"

        read -p "input first number" num1

        read -p "input second number" num2

        echo "the two number are $num1 and $num2 !"

        return $(( $num1+$num2 ))

}

 

funWithReturn

ret=$?

echo "sum = $ret"

 

执行函数,得到两个数的和.

 

案例三:

#!/bin/bash

number_one() {

        echo "number_one"

        number_two

}

 

number_two()

{

        echo "number_two"

}

number_one

执行命令:[root@localhost tmp]# sh function2.sh 

输出结果:

number_one

number_two

 

分析:定义shell函数的语法为

[funciton] funname [()]

{

action

[ return int ]

}

说明:

1.可以带function fun()定义,也可以直接fun()定义,不带任何参数(关键字function可以省略).

2.函数返回,可以显示的加:return返回,如果不加,将以最后一条命令的运行结果作为返回值.

 

 

Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快。

 

语句部分可以是任意的Shell命令,也可以调用其他的函数。

如果在函数中使用exit命令,可以退出整个脚本,通常情况,函数结束之后会返回调用函数的部分继续执行。

可以使用break语句来中断函数的执行。

declare 可以显示定义的函数清单

declare F可以只显示定义的函数名

unset 可以从Shell内存中删除函数

export f将函数输出给Shell

另外,函数的定义可以放到.bash_profile文件中,也可以放到使用函数的脚本中,还可以直接放到命令行中,还可以使用内部的unset命令删除函数。一旦用户注销,Shell将不再保持这些函数。

 

补充一下,就是:

$0:是脚本本身的名字;

$#:是传给脚本的参数个数;

$@:是传给脚本的所有参数的列表,即被扩展为"$1" "$2" "$3"等;

$*:是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个,即被扩展成"$1c$2c$3",其中cIFS的第一个字符;

$$:是脚本运行的当前进程ID号;
$?:是显示最后命令的退出状态,0表示没有错误,其他表示有错误;

 

举例说:

脚本名称叫test.sh 入参三个: 1 2 3

运行test.sh 1 2 3

$*"1 2 3"(一起被引号包住)

$@"1" "2" "3"(分别被包住)

$#3(参数数量)

 

其中exit  是用来结束一个程序的执行的,而return只是用来从一个函数中返回。

exit(0)表示正常退出执行程序,如果加其它的数值:12....可以表示由于不同的错误原因而退出  

那么,123怎么对应不同的原因?   --你自己想让它是什么意思,它就是什么意思.

但一般都有常用的、通用的含义:比如   0   一般都表示正常返回、退出。

因此,,在main函数中exit(0)等价于return 0

 

 

全局变量

这种类似与C语言中的全局变量(或环境变量)

案例:

#!/bin/bash

g_var=

function mytest()

{

        echo "mytest"

        echo " args $1"

        g_var=$1

 

        return 0

}

mytest 1

echo "return $?"

 

echo

echo "g_var=$g_var"

分析:主要是echo "return $?"输出时0不好理解,这个是说上一行的mytest这个函数执行成功了,所以值为0,但是在这个函数的内部给全局变量重新赋值.所以结果为:

mytest

 args 1

return 0

 

g_var=1

 

函数没有提供局部变量.因此所有的函数都与父脚本共享变量;,你必须小心留意不要修改父脚本里不期望改变的东西,例如:path.不过这也表示其他状态是共享的,例如当前木与捕捉信号.

shell学习三十一天----函数问题

标签:shell

原文地址:http://blog.csdn.net/shanyongxu/article/details/46670743

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!