linux学习(九) shell脚本(6)

转载 2013年12月03日 23:25:44
创建函数
1.基本脚本函数
1.1创建函数
方式一:使用关键字 function,后跟代码块的函数名。
function name{
	commands
}
name名称需要唯一在一个脚本中,
方式二:
name(){
commands
}
函数引用,直接调用函数名即可。
函数定义不一定位于shell脚本的起始部分,但应该注意,如果在函数定义之前使用函数,会受到错误信息。
1.2返回值
(1)默认退出状态
	默认情况下,函数的退出状态是函数的最后一条命令返回的退出状态。函数执行完毕之后可以使用标准变量$? 来获得函数的退出状态。
(2)使用return命令
	bash shell使用return命令以特定退出状态退出函数。return命令可以使用单个整数值来定义函数退出状态,提供了一种通过编程设置函数退出状态的简单方法:
function fun1 {
	read -p"Enter a value:" value
	echo "doubling the value"
	return $[$value * 2]
}
fun1
echo "The new value is : $?"
////上例中,将value乘2后的结果作为结束状态返回,通过$?获得结束状态,也就是希望得到的结果。
需要注意:
(a)在函数完成之后尽快提取返回值,因为再次执行其他命令会覆盖返回值{$?为最近一次命令的返回状态
(b)退出状态的取值范围为0-255
(c)使用函数输出
	函数的输出也可以捕获并存放到shell变量中,这种方法可以从函数获取任意类型的输出并给变量赋值:
result=`fun1`
	这个方法可以返回浮点数和字符串,所以这种方法可以非常灵活的从函数返回数据。
1.3 在函数中使用变量
(1)向函数传递参数
	函数可以使用标准参数环境变量来表示命令行传递给函数的参数。如,函数名在$0定义,函数命令行的其他参数使用变量$1, $2.等。专用变量$#可以用来确定传递给函数的参数数目(不包括函数名$0)
	在脚本中指定函数时,必须在函数所在的命令行提供参数。如下:
fun1 $value1  10
这样,该函数才可以使用参数环境变量获取参数值。使用这种方法向函数传递值。
additem () {
	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=`additem 10 15`
echo $value


函数的变量$0, $1, $2 等等,不同于脚本主代码的 $0, $1, $2 等等。如果想在函数中使用命令行参数送来的值,需要在调用该函数时,手动传递这些数据。
mulitem () {
	echo $[$1 * $2]
}

if [ $# -eq 2 ]
then
	value=`mulitem $1 $2`
	echo result is $value
fi

./test.sh 3 4

(2)在函数中处理变量
全局变量
	如果脚本的主体定义了全局变量,则在函数内部可以获取这个变量的值;如果在函数内部定义了全局变量,脚本的主体代码也可以获取该变量的值。
	默认情况下,脚本中定义的变量都是全局变量。在函数外部定义的变量,在函数内部仍能访问。
局部变量
	函数内部使用的变量为局部变量,这只需要在变量声明前加上local关键字 :local value
也可以给局部变量赋值语句加上local关键字: local value=$[$value + 2]
	关键字local确保变量仅在函数内部使用。如果脚本在函数外部有同名变量,则shell能区分开这两个变量。在函数内部操作局部变量时,函数外部的同名变量不受影响。

4.数组变量和函数

5.使用库文件
	可以将一个shell脚本中定义多个函数和变量,作为库文件;这样其他shell脚本可以直接引用该库文件。如:
test.sh
#!/bin/bash
#test bash shell
mulitem () {
	echo $[$1 * $2]
}
additem () {
	echo $[$1 + $2]
}

test1.sh
#!/bin/bash


. ./test.sh 
#相当于引用库, 注意前面的点操作符+库文件的路径

value1=`additem 1 3`
value2=`mulitem 3 4`
echo "The additem result is : $value1"
echo "The mulitem result is : $value2"
6.在shell终端中直接使用函数:
可以在命令行中定义函数,此次终端会话中,该函数有效,如果关闭了终端,则函数失效。
为了下次打开终端仍然能够使用函数,则可以
1)将函数定义写在.bashrc中,这样每次打开shell终端之后,仍然能够使用该函数。
jason@Ubuntu:~$ function additem { echo $[$1 + $2]; }
jason@Ubuntu:~$ additem 10 3
13
这样要求,每条语句后面要有分号隔开;
jason@Ubuntu:~$ function mulitem {
> echo $[$1 * $2]
> }
jason@Ubuntu:~$ mulitem 3 4
12
2)提供函数文件:在一个shell 脚本文件中创建函数,将该脚本文件完整路径名添加到.bashrc中。

【Linux】Shell脚本学习总结篇

【Linux】Shell脚本学习总结篇shell学习分为下面3个部分: shell基本命令回顾 shell基本语法学习 awk/sed 工具学习 关于shell的介绍之类的在这里不做赘述!shell基...
  • bitboss
  • bitboss
  • 2017年06月11日 17:24
  • 1201

Shell脚本学习(一)Shell命令基础

Shell脚本学习(一)Shell命令基础
  • birdben
  • birdben
  • 2016年08月08日 23:55
  • 19955

Shell脚本初步学习-鸟哥Linux私房菜基础学习篇

Shell脚本对于Linux下的系统管理员和运维的人来说很重要。最近看了一下Shell脚本,为了系统地学习一下Shell脚本,我看了一下《鸟哥的Linux私房菜基础学习篇》第三版,其中的第13章讲了一...
  • ccf19881030
  • ccf19881030
  • 2013年05月14日 23:19
  • 4891

shell脚本中$#、$0、$@等特殊变量的含义

#!/bin/sh echo "\$#:$#" echo "\$0:$0" echo "\$1:$1" echo "\$2:$2" echo "\$@:$@" echo "\$*:$*" echo "...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2013年11月16日 22:02
  • 1678

Linux学习总结(29)——CentOS 6和CentOS 7区别总结

centos7与6之间最大的差别就是初始化技术的不同,7采用的初始化技术是Systemd,并行的运行方式,除了这一点之外,服务启动、开机启动文件、网络命令方面等等 1.系统初始化技术 Sysvin...
  • u012562943
  • u012562943
  • 2017年05月03日 10:18
  • 1645

shell脚本学习 6 补充

缺省值(:-) 如果变量后面跟着冒号和减号,则变量后面跟着是这个变量的缺省值。 $ COMPANY= $ printf “%s/n” “${COMPANY:-Unknown Company}” ...
  • yuyi_000
  • yuyi_000
  • 2015年09月26日 23:32
  • 157

shell脚本学习6——数组

Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元...
  • Watson2016
  • Watson2016
  • 2016年08月30日 11:46
  • 205

shell脚本学习10——函数

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,Shell 也支持函数。Shell 函数必须先定义后使用。 Shell 函数的定义格式如下...
  • Watson2016
  • Watson2016
  • 2016年08月30日 12:40
  • 576

小四轴9轴数据融合成功

前两天二代硬件终于到齐了,室友风风火火焊出来两架新硬件,没想到电路板上产生的磁场比地磁场还强,导致磁力计数据变化不明显,害得我们以为是焊接问题(毕竟DataSheet说不推荐手工焊接且温度不能超过26...
  • u010097644
  • u010097644
  • 2017年04月28日 00:38
  • 1084

菜鸟shell 脚本学习日记

1、shell 脚本统计当前目录下指定后缀文件行数: 获取当前目录下所有后缀为.txt 文件行数,包含空白行(包括子目录): $find . -name "*.sh" |xargs cat |wc -...
  • cxj415
  • cxj415
  • 2017年11月29日 23:10
  • 52
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux学习(九) shell脚本(6)
举报原因:
原因补充:

(最多只允许输入30个字)