shell基础知识学习四

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
----


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

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

 

到这里就差不多了,函数的基本操作就这些了。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值