您的位置:首页 > 运维架构 > Shell

shell基础知识学习四

2012-09-28 18:48 513 查看
shell中函数类似于java中的方法,脚本代码放在函数中,可以任意位置运行减少大量重复代码。

了解掌握shell函数主要从以下几点:函数的创建、函数调用、变量、返回值、参数。

1、函数创建以及调用。

基本结构:有两种方式带function和不带function,

function  hello ()
{
}
以及
hello ()
{
}

举个例子:

#!/bin/sh
function hello()
{
echo "this is a day : `date`"
}
echo '======='
hello
echo '======='

#执行结果
=======
this is a day : Fri Sep 28 11:56:00 CST 2012
=======


需要注意的是:1、函数的创建一定在调用之前。2、函数名称不要重复,否则先定义的会被覆盖。

2、返回值

首先说下默认退出状态,在脚本中用$?表示。表示:最后一次执行命令的退出状态,0代表成功,非0代表失败。

2.1、$?
#!/bin/sh
function hello()
{
echo "this is a day : `date`"
cd /qwer
}

echo "state:$?"

echo '======='
hello
echo "state: $?"
echo '======='
#执行结果:
state:0
=======
this is a day : Fri Sep 28 12:12:31 CST 2012
./fun.sh: line 5: cd: /qwer: No such file or directory
state: 1
=======

如上所示:两个$?分别0和1,对比来看下一个程序:

#!/bin/sh
function hello()
{
echo "this is a day : `date`"
cd /qwer
}

echo "state:$?"

echo '======='
hello
echo "test..test..."
echo "state: $?"
echo '======='
#执行结果:
state:0
=======
this is a day : Fri Sep 28 12:19:28 CST 2012
./fun.sh: line 5: cd: /qwer: No such file or directory
test..test...
state: 0
=======


现在可以深刻理解$?的含义了,shell命令最后一次的执行状态,当执行完函数后又执行了其他的命令,那么$?就表示其他命令的执行状态了。

关于$?还有一个好玩的:

#!/bin/sh
function hello()
{
cd /qwer
echo "this is a day : `date`"
}

echo "state:$?"

echo '======='
hello
echo "state: $?"
echo '======='
#执行结果:
state:0
=======
./fun.sh: line 4: cd: /qwer: No such file or directory
this is a day : Fri Sep 28 12:26:43 CST 2012
state: 0
=======


好吧,默认退出状态不太好用吧。

2.2、使用返回值return

return只能返回单个的整数,对于字符串脚本会报错。

看下面的程序。用户输入值和100比较,返回不同的值。

read -p "please input :" value
test()
{
if [ $value -lt 100 ]
then
echo "< 100 "
return -1
elif [ $value -eq 100 ]
then
echo "= 100"
return 0
else
echo "> 100"
return 1
fi
}

test
echo "result value is :$?"
#执行结果:
please input :999
> 100
result value is :1


即是return的返回值由$?接受。

====================================

有一点很疑惑,如果在上述脚本if语句的结束后,加上return 1000

最后程序的输出,

please input :999

> 100

result value is :1

为什么是1?有的时候是255,???

====================================

另外在一种方法就是使用函数的输出。输出可以被捕获放入shell变量中。

ceo () {
read -p "please input a value:" value
echo $[ $value * 2 ]
}
result=`ceo`
echo "the result is : $result"
#执行结果:
please input a value:999
the result is : 1998


注意接受的时候是result = `ceo`

====================================

还是上述脚本,把输出替换成:

echo $[ $vale ]

echo $[ $value * 2 ]

输出变成了:the result is : 0

不明白?

====================================

3、参数的传递

shell脚本函数参数的传递可以用标准参数环境变量表示。

如下脚本:根据传入参数个数不同,做不同输出

#!/bin/sh
function param()
{
if [ $# -lt 2 ]
then
echo "param count < 2"
elif [ $# -gt 2 ]
then
echo "param count > 2 "
else
echo "param count =2"
fi
}

param 1 2 3

#执行结果:
param count > 2


需要注意的是,函数不能直接使用脚本的参数,函数为自己的参数使用专用的参数环境变量。

就是说在运行脚本时候,用命令行传入的参数函数是无法直接使用的,必须手动传入才可以。

看下面的例子:

function useMainPram()
{
echo "----"
echo $1
echo $2
echo "----"
}
echo $1
echo $2

useMainPram
#文件命名为param.sh
./param.sh 98 99
执行结果:
98
99
----

----

函数中的打印没有值,调整脚本中函数调用为:useMainPram $1 $2

同样的执行命令,结果正确展示。

4、变量

变量主要是作用域的问题,在脚本内(不是函数内部)定义的变量在任何地方都是可以用的,属于全局变量。

函数内部可以定义局部变量用local修饰,作用域仅仅在函数内部。

b=100
function tt()
{
local b=10
result=$[$b + 5 ]
}
tt
echo $result
echo $b

#执行结果:
15
100


5、库文件

函数可以在脚本内部使用,如果多个脚本要使用同一个函数就要使用到库文件。

首先创建库文件,文件名称ku,注意是没有后缀名称的:

function useMainPram()
{
echo "----"
echo $1
echo $2
echo "----"
}


然后在脚本文件中调用,脚本命名param.sh:

. ./ku
echo $1
echo $2

useMainPram $1 $2

#执行结果 ./param.sh:

98
99
----
98
99
----


需要注意的是:引入库文件的格式

点后面有个空格,然后是执行库文件。

到这里就差不多了,函数的基本操作就这些了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: