创建函数
基本脚本函数
返回值
在函数中使用变量
数组变量和函数
函数递归
创建库
在命令行上使用函数
=========
函数 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` 得用` 将它当作一个命令来使用。。。
[[email protected] shell]$ cat h
#!/bin/bash
#using function
function f1(){
echo "oh"
var=$[ 100*100 ]
}
result=`f1()`
echo "$result"
[[email protected] shell]$ ./h
./h: command substitution: line 10: syntax error: unexpected end of file
[[email protected] shell]$
首先,函数的()问题!!!!,无论是哪种函数形式,在使用的时候都无需()
第二,两种函数中,定义时如果使用(),就不用关键字function了,否则会出错。
[[email protected] shell]$ ./h
oh
[[email protected] shell]$ cat h
#!/bin/bash
#using function
function f1(){
echo "oh"
var=$[ 100*100 ]
}
result=`f1`
echo "$result"
[[email protected] shell]$
改一下:
[[email protected] shell]$ ./h
./h: line 4: syntax error near unexpected token `read'
./h: line 4: `read -p "enter a value: " value'
[[email protected] shell]$ cat h
#!/bin/bash
function f1{
read -p "enter a value: " value
echo $[ $value*2 ]
}
result=`f1`
echo " the ansers is $result"
[[email protected] shell]$
还是不行,。》》》》》》》
最后发现原理:函数的括号位置,必须与函数名间有个空格。。。。。
[[email protected] shell]$ cat h
#!/bin/bash
function f1 {
read -p "enter a value: " value
echo $[ $value*2 ]
}
result=`f1`
echo " the ansers is $result"
[[email protected] shell]$ ./h
enter a value: 123
the ansers is 246
[[email protected] shell]$
在这里,我没有使用return,而在赋值的时候,result是怎么知道谁给它的呢??
[[email protected] 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"
[[email protected] shell]$ ./h
enter a value: 1
the ansers is 2
hi
[[email protected] shell]$
目前看来是最后一个echo语句的结果给了result
[[email protected] shell]$ ./h
enter a value: 1
the ansers is 2
hi
[[email protected] shell]$ vim h
[[email protected] 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
[[email protected] shell]$
看来只有echo 的内容会给result , 并且函数是有生命期的,var变量在函数结束后就消亡了???????。。。
在函数中使用变量:
也跟命令一样,函数也可以带参数, func $value 10
并且 $0是函数名 $1 是第一个参数 $2 是第二个参数 $#是参数个数
参数和函数名必须放到同一行里。。。。。。
[[email protected] 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
[[email protected] shell]$ ./s
adding 10 and 15: 25
let's try adding just one parameter20
now let's try no parameter-1
[[email protected] shell]$
现在你可能会写出这样的东西:在脚本的参数也是 $1 ....等,是否直接可以用在函数里呢???
答案是不行的,,但是你可以使用传值的形式: func $1 $2...
将脚本接收到的参数当作脚本内的普通变量来处理。。。。
那么我就有个问题了,变量的作用域。。。如果函数里改变了$1 ,函数外的$1会不会改变????
shell 脚本中的全局变量是在全脚本里的任何地方都有效的变量:
那么如何定义一个全局变量,在函数里可以定义全局变量吗??
从而引出作用域的问题:全局变量,局部变量
首先:默认情况下脚本主体中定义的变量都是全局变量
先看个危险的例子:
[[email protected] shell]$ cat hb
#!/bin/bash
#using function
function ff {
echo "ff ...$value"
value=$[ $value+1 ]
}
value=111
ff
echo $value
[[email protected] shell]$ ./hb
ff ...111
112
[[email protected] shell]$
是的,我在函数内可以修改函数外的变量(因为是全局变量)
并且在函数外新值也是有效的,但是强烈不建议这么做。。。
我们很惊讶的发现 脚本创建来的参数就不能那么做:
[[email protected] shell]$ cat s
#!/bin/bash
#using function
func() {
echo $1+$2
}
echo "out of function $1+$2"
func
[[email protected] shell]$ ./s 12 2
out of function 12+2
+
[[email protected] shell]$
现在我想在函数里定义局部变量:你可以这么做:
使用local关键字
当然你可义先声明: local var
也可以直接定义: local var=$[ $value+3 ]
其实在函数内定义的变量都是局部变量?????但使用local 可以使程序可读性增强。。。
而在函数外使用与函数内相同的变量名时,脚本会很聪明的分辨这两个变量,在函数里就是函数自身的局部变量。。。
两者互不影响。。。或许这就是local关键字的好处吧
[[email protected] shell]$ cat s
#!/bin/bash
#using function
func() {
w=12
local q=100
}
func
echo "out of function $w"
echo "local q=$q"
[[email protected] shell]$ ./s
out of function 12
local q=
[[email protected] shell]$
哈哈,当你在函数里没使用local关键字而定义变量时,它不一定就是个局部变量,而使用local 的话就一定是个局部变量。
[[email protected] 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
[[email protected] shell]$ ./h
enter a value: 12
the ansers is 24
hi
in function 10000
[[email protected] shell]$
==========
数组变量和函数
1.向函数传递数组参数
1. myarray=(1 2 3 4 5)
2. function a {
3. echo "the parametes are : [email protected]"
3. thisarray=$1
4. echo "the received array is ${thisarray[*]}"
}
5. a $myarray
6. echo "the original array is:${myarray[*]}"
先来看第一句创建了一个名叫myarray的数组
来看第5句,我把myarray当作函数的第一个参数传入函数
在函数里[email protected]会有整个数组的内容吗??
不会的 只有数组的第一个参数 1
也就是说这样做函数只会取数组的第一个变量
函数里的thisarray就不是个数组了,但我却把它当成了一个数组来使用。会报错的。
-----
如何解决这个问题??
首先必须是把数组分解为当个值传入函数,在函数内部再将所有的参数传到函数里的变量里
如 a ${myarray[*]} 或者 a `echo ${myarray[*]}`
函数内部: localarray=(`echo "[email protected]"`)
====
从函数返回数组
在函数的最后一个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找到这些函数。。。
直接命令行上定义函数
[[email protected] shell]$ function aaa { echo "wertt" ;value=12 ;echo $[ $value+12 ]}
> ;
bash: syntax error near unexpected token `;'
[[email protected] shell]$ function aaa { echo "wertt" ;value=12 ;echo $[ $value+12 ];}
[[email protected] shell]$
可以看到必须以;来当作每一个语句结束
当然也可以多行,直到你输入}
[[email protected] shell]$ function qwe {
> echo "ph";
> echo "oh";
> }
[[email protected] shell]$ qwe
ph
oh
[[email protected] shell]$
首先,只要是个shell 就会有它自己的运行上下文,,,,而有个文件是所有的shell都会去执行的:
.bashrc
在.bashrc的最后几行添加函数就行。。
如果我有一个库呢??
使用source命令(.)
在脚本里也可以直接使用了。。。