创建函数


基本脚本函数

返回值

在函数中使用变量

数组变量和函数

函数递归

创建库

在命令行上使用函数


=========

函数 function


在shell脚本里创建函数:有两种方式

1.  

function name {

  commands

}

2.


name( ) {

commands

}


在脚本里使用函数,由于是顺序执行,还没定义就使用函数是会出错的。

返回值:bash shell 会把函数当作一个小型脚本,运行结束时会返回一个退出状态码,默认情况下,以最后一条命令的退出状态码

作为函数的退出状态码。

执行完函数后,可使用 标准的$? 变量来捕获退出状态码。

如果函数的最后一条命令没有运行成功,退出状态码可能就不是0了,而是1.

请看:

func1(){

ls -l aaaaaadfdsfsdfds

echo "oh"

}

最后一条语句执行成功

//

func2(){

echo "oh"

ls -l dfjksfsjf

}

最后一条语句执行失败



使用return:

func3(){

ls /

echo ""

return $ [ ... ]

}

return 到$?那里了。。。。

但是,退出状态码的值是有范围的 0~255

而且不能返回字符串。。。。。


所以:使用函数输出:

将函数输出赋给变量

var=`func`  得用` 将它当作一个命令来使用。。。

 

[oh@localhost shell]$ cat h
#!/bin/bash
#using function

function f1(){

echo "oh"
var=$[ 100*100 ]
}
result=`f1()`
echo "$result"

[oh@localhost shell]$ ./h
./h: command substitution: line 10: syntax error: unexpected end of file

[oh@localhost shell]$ 

首先,函数的()问题!!!!,无论是哪种函数形式,在使用的时候都无需()

第二,两种函数中,定义时如果使用(),就不用关键字function了,否则会出错。

[oh@localhost shell]$ ./h
oh
[oh@localhost shell]$ cat h
#!/bin/bash
#using function

function f1(){

echo "oh"
var=$[ 100*100 ]
}
result=`f1`
echo "$result"

[oh@localhost shell]$ 

改一下:

[oh@localhost shell]$ ./h
./h: line 4: syntax error near unexpected token `read'
./h: line 4: `read -p "enter a value: " value'
[oh@localhost shell]$ cat h
#!/bin/bash

function f1{
read -p "enter a value: " value
echo $[ $value*2 ]
}

result=`f1`
echo " the ansers is $result"

[oh@localhost shell]$ 

还是不行,。》》》》》》》

最后发现原理:函数的括号位置,必须与函数名间有个空格。。。。。

[oh@localhost shell]$ cat h
#!/bin/bash

function f1 {
read -p "enter a value: " value
echo $[ $value*2 ]
}

result=`f1`
echo " the ansers is $result"

[oh@localhost shell]$ ./h
enter a value: 123
 the ansers is 246
[oh@localhost shell]$ 

在这里,我没有使用return,而在赋值的时候,result是怎么知道谁给它的呢??

[oh@localhost shell]$ cat h
#!/bin/bash

function f1 {
read -p "enter a value: " value
echo $[ $value*2 ]
echo "hi"
}

result=`f1`
echo " the ansers is $result"

[oh@localhost shell]$ ./h
enter a value: 1
 the ansers is 2
hi
[oh@localhost shell]$ 

目前看来是最后一个echo语句的结果给了result

[oh@localhost shell]$ ./h
enter a value: 1
 the ansers is 2
hi

[oh@localhost shell]$ vim h
[oh@localhost shell]$ cat h
#!/bin/bash

function f1 {
read -p "enter a value: " value
echo $[ $value*2 ]
echo "hi"
var=$[ 100*100 ]
}

result=`f1`
echo " the ansers is $result"
echo $var
[oh@localhost shell]$ 

看来只有echo 的内容会给result  , 并且函数是有生命期的,var变量在函数结束后就消亡了???????。。。


在函数中使用变量:

也跟命令一样,函数也可以带参数,   func $value 10

并且  $0是函数名   $1 是第一个参数   $2 是第二个参数   $#是参数个数

参数和函数名必须放到同一行里。。。。。。

[oh@localhost shell]$ cat s
#!/bin/bash
#using function

function ad {
if [ $# -eq 0 ] || [ $# -gt 2 ]
then 
	echo -1
elif [ $# -eq 1 ]
then
	echo $[ $1 + $1 ]
else
	echo $[ $1 + $2 ]
fi
}
echo -n "adding 10 and 15: "
value=`ad 10 15`
echo $value

echo -n "let's try adding just one parameter"
value=`ad 10`
echo $value

echo -n "now let's try no parameter"
value=`ad`
echo $value

[oh@localhost shell]$ ./s
adding 10 and 15: 25
let's try adding just one parameter20
now let's try no parameter-1
[oh@localhost shell]$ 

现在你可能会写出这样的东西:在脚本的参数也是 $1 ....等,是否直接可以用在函数里呢???

答案是不行的,,但是你可以使用传值的形式:   func $1 $2...

将脚本接收到的参数当作脚本内的普通变量来处理。。。。

那么我就有个问题了,变量的作用域。。。如果函数里改变了$1 ,函数外的$1会不会改变????


shell 脚本中的全局变量是在全脚本里的任何地方都有效的变量:

那么如何定义一个全局变量,在函数里可以定义全局变量吗??


从而引出作用域的问题:全局变量,局部变量

首先:默认情况下脚本主体中定义的变量都是全局变量

先看个危险的例子:

[oh@localhost shell]$ cat hb
#!/bin/bash
#using function

function ff {
echo "ff ...$value"
value=$[ $value+1 ]

}

value=111
ff
echo $value
[oh@localhost shell]$ ./hb
ff ...111
112
[oh@localhost shell]$ 

是的,我在函数内可以修改函数外的变量(因为是全局变量)  

并且在函数外新值也是有效的,但是强烈不建议这么做。。。

我们很惊讶的发现  脚本创建来的参数就不能那么做:

[oh@localhost shell]$ cat s
#!/bin/bash
#using function   

func() {
echo $1+$2
}
echo "out of function $1+$2"
func

[oh@localhost shell]$ ./s 12 2
out of function 12+2
+
[oh@localhost shell]$ 


现在我想在函数里定义局部变量:你可以这么做:

使用local关键字

当然你可义先声明: local var

也可以直接定义:  local var=$[ $value+3 ]

其实在函数内定义的变量都是局部变量?????但使用local 可以使程序可读性增强。。。


而在函数外使用与函数内相同的变量名时,脚本会很聪明的分辨这两个变量,在函数里就是函数自身的局部变量。。。

两者互不影响。。。或许这就是local关键字的好处吧

[oh@localhost shell]$ cat s
#!/bin/bash
#using function   

func() {
w=12
local q=100
}
func
echo "out of function $w"
echo "local q=$q"


[oh@localhost shell]$ ./s
out of function 12
local q=
[oh@localhost shell]$ 

哈哈,当你在函数里没使用local关键字而定义变量时,它不一定就是个局部变量,而使用local 的话就一定是个局部变量。

[oh@localhost shell]$ cat h
#!/bin/bash

function f1 {
read -p "enter a value: " value
echo $[ $value*2 ]
echo "hi"
var=$[ 100*100 ]
echo "in function $var"
}

result=`f1`
echo " the ansers is $result"
echo $var
[oh@localhost shell]$ ./h
enter a value: 12
 the ansers is 24
hi
in function 10000

[oh@localhost shell]$ 


==========

数组变量和函数


1.向函数传递数组参数


1. myarray=(1 2 3 4 5)


2. function a {

3. echo "the parametes are : $@"

3. thisarray=$1

4. echo "the received array is ${thisarray[*]}"

}

5. a $myarray

6. echo "the original array is:${myarray[*]}"


先来看第一句创建了一个名叫myarray的数组

来看第5句,我把myarray当作函数的第一个参数传入函数

在函数里$@会有整个数组的内容吗??

不会的 只有数组的第一个参数  1

也就是说这样做函数只会取数组的第一个变量

函数里的thisarray就不是个数组了,但我却把它当成了一个数组来使用。会报错的。

-----

如何解决这个问题??

首先必须是把数组分解为当个值传入函数,在函数内部再将所有的参数传到函数里的变量里

如   a ${myarray[*]}   或者  a `echo ${myarray[*]}`

函数内部:  localarray=(`echo "$@"`)


====

从函数返回数组

在函数的最后一个echo语句 返回就行:

function a {

..

...

echo ${newarray[*]}

}
result=`a ${myarray[*]}`


==========

函数的递归:

特性:自成体系(self-containment)  所以可以递归调用。

如x的阶乘


function factorial {

if [ $1 -eq 1]

then

    echo 1

else

    local temp=$[ $1 - 1 ]

    local result=`factorial $temp`

    echo $[ $result * $1 ]

fi

}

重点是local result=`factorial $temp`

===

好了,现在你会这么多的函数想在其它的脚本里使用它们,就得使用个叫库的东西。

首先是shell 函数的作用域:和环境变量一样,shell函数只对定义它的shell会话有效。

例如我这里有个脚本叫myfunc里面有个额函数func

还有个脚本ww:

./myfunc

func 23

------

虽然把myfunc的文件地址告诉了shell,但是光是这样是没用的。

得使用 source命令,它会在当前shell的上下文寻找命令,而不是传建一个新的shell环境来运行命令,再指定库就行

source有个别名,点操作符(dot operator )

这个时候只要   ../myfunc  就行了,第一个点就是source命令了。


在命令行上使用函数。。。

主要问题是脚本在不在PATH环境变量里,想让shell找到这些函数。。。

直接命令行上定义函数

[oh@localhost shell]$ function aaa { echo "wertt" ;value=12 ;echo $[ $value+12 ]}
> ;
bash: syntax error near unexpected token `;'
[oh@localhost shell]$ function aaa { echo "wertt" ;value=12 ;echo $[ $value+12 ];}
[oh@localhost shell]$ 

可以看到必须以;来当作每一个语句结束

当然也可以多行,直到你输入}

[oh@localhost shell]$ function qwe {
> echo "ph";
> echo "oh";
> }
[oh@localhost shell]$ qwe
ph
oh
[oh@localhost shell]$ 

首先,只要是个shell   就会有它自己的运行上下文,,,,而有个文件是所有的shell都会去执行的:

.bashrc

在.bashrc的最后几行添加函数就行。。


如果我有一个库呢??

使用source命令(.)

在脚本里也可以直接使用了。。。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值