LinuxShell之七函数应用

作者:网络    软件教程库   2020-05-17

函数是什么?

函数是一些命令的集合,使用一个名称做代表,称为函数名称。函数名称的命名规则和变量相同。

一旦函数定义好了,执行这个名称,就好象执行bash的命令一样,称为调用函数。实际上,bash调用函数时,会执行函数里的命令区域,执行

完毕,bash会回到调用函数的下一行继续执行。

函数的最大作用是可以让程序模块化。如果script程序中,需要重复执行某一命令区域,那么就应当使用函数代表这个区域,一方面可使程序精简,一方面程序代码页比较容易维护。

一、函数的用法

1、函数的语法

语法1:

function 函数名称()

{

命令区域

}

函数名称与()之间可以直接相连,也可用空格隔开。

语法2:

函数名称()

{

命令区域

}

关键词function可省略

语法3:

function 函数名称

{

命令区域

}

如果使用关键词function,函数名称后的()也可省略

例子:

#!/bin/bash

getline () #定义函数getline,用来定义文件行数

{

local i=0 #i代表已计算的行数,先归0。

#local用来设定变量i是getline函数中专有的变量,不影响script其它地方也叫i的函数

while read line

do #使用while循环,自变量值$file指定文件读取每一行

let ++i #每读一行 变量i值+1

done $file #使用转向输入,让read能由$file读取数据

echo "$file文件共有$i行" #显示总行

}


file=$1 #由命令行第一个参数,取得要计算行数的文件名。

getline #调用getline函数

echo "getline 执行完毕" #getline执行完后,回到这里继续执行下一指令。

#./script passwd

passwd文件共有36行

getline执行完毕

在调用函数之前一定要先定义该函数。

unset -f 函数 取消函数

2、函数的结束状态

执行函数时,函数中最后一个命令的传回值代表函数的结束状态。执行函数如果遇到return命令,就立即结束,回到调用函数的下一个命令,此时函数的传回值为0

#!/bin/bash

getline ()

{

local i=0

while read line

do

let ++i

if (($i 10));then #判断是否超过10行

echo "$file文件大于10行,不再继续"

return #遇到return命令,立即回到echo$所在行

#默认传回值为0,也可指定不同的传回值,直接在return空格加数字即可

fi

done $file

echo "$file文件共有$i行"

}


file=$1

getline

echo $

echo "getline 执行完毕"


可以根据$(return 接的数字n )的值执行想要的命令,如上 if[ $ -eq 3 ];then

echo "行数过多,放弃读取"

else

echo ‘getline执行完毕‘

fi

二、函数与变量的作用范围。

1、函数的作用范围

函数仅在定义的shell环境中有效,bash执行函数时,并不会另外再开启一个子shell。

如果要传递函数给shell环境使用,可以用内置命令export -f函数名称,这样此函数就变成了环境变量的一部分(函数型),可供子shell的script调用。

2、变量的作用范围

如果没有特别的设定变量的属性,那么在script中自定义的变量称为全局变量(对此脚本而言)。作用范围在整个script文件中皆有效。

#!/bin/bash

getline ()

{

local i=0 #这就定义了变量i只在函数getline中有效,变量i和函数外其它叫i的变量完全不一样。

while read line

do

....

三、位置参数

1、命令行的位置参数

$0 表示脚本名 $1 表示第一个参数 $2表示第2给参数 $(10)表示第10个参数

$* 代表所有的位置参数,看为一个字符串。1.sh a x y则$*为"a x y"

[email#160;protected] 代表所有以空白隔开的参数,各位置串行。 1.ah a x y则[email#160;protected]为"a"、"x"、"y"

$# 位置参数的个数,1.ah a x y则$#的值为3

#!/bin/bash

if [ $# -ne 2 ];then 必须键入2个参数,否则错误退出

echo "使用方法:./$0 参数1 参数2"

exit 1

fi

2、移动位置参数

bash的内置命令shift可以往前移动位置参数的值,语法如下:

shift n

n为正整数,代表往前移动的次数。n可以省略不写代表移动一次。执行 shift n,$(n+1)的值会放入$1

以执行shift命令来说(不指定次数),$2的值放入$1,$3的值放入$2,$4的值放入$3,,,如果一直执行shift(次数=n),会把所有的位置参数清空

shift 一次清除1个(从$1开始) ,shift 2 一次清除2个

#!/bin/bash
echo"\[email#160;protected]的初始值为[email#160;protected]"
whileshift
do
[-n"$1"]echo"shift1次,\[email#160;protected]的变化:[email#160;protected]"
done
执行结果:
[[email#160;protected]tmp]#bash1.shabcde
[email#160;protected]的初始值为abcde
shift1次,[email#160;protected]的变化:bcde
shift1次,[email#160;protected]的变化:cde
shift1次,[email#160;protected]的变化:de
shift1次,[email#160;protected]的变化:e

3、指定位置参数的值

指定位置参数的值称为重置(reset),用bash命令set

#!/bin/bash
declare-ii=0
set1020304050
forpin[email#160;protected]
do
((i++))
echo"第$i个位置参数$$i=$p"#$$目前bashshell的进程编号
done
[[email#160;protected]tmp]#bash2.sh
第1个位置参数3547i=10
第2个位置参数3547i=20
第3个位置参数3547i=30
第4个位置参数3547i=40
第5个位置参数3547i=50

一旦用set重置位置参数,其原有的值就会消失,改以新值取代。(无论输入几个参数,set设置几个就是几个)

如果要一次重置所有参数,使其值为空,可执行 set --

4、取用命令行的选项和参数

在设计脚本的时候,往往需要由命令行中取得用户提供的选项和参数,根据不同的选项,脚本有不同的处理方式和执行结果。选项的使用方式可以

是单一选项,也可以在选项后方加上准备作用的参数,而且,选项出现的次序并没有严格的要求。

如以下例子:

./script -u jacken -a -h

或改用以下形式

./script -a -u jacken -h

如果要想取得这些选项和参数,使用前述的位置参数也是可以的,不过拿到位置参数后,必须再做许多条件判断才行,因为选项可能以不同的次序

出现在命令行不同的位置,情况十分复杂。解决这样的问题,可改用bash提供的内置命令getopts。

getopts语法如下:

getopts 选项行 选项变量

其中选项行,是由各选项的单一字符组成,如前述例子中用来3个选项,可组合成“u:ah”

如果某一个选项字符后方,接上":" 则表示该选项需要提供一个参数,如这里的u后面有":"

如果执行脚本的时候,选项u后方没有提供额外的参数,那么bash就会显示“option requires an argument --u”的错误信息。

如果不想出现这种错误信息,可在选项行最前面加上":" 如 ":u:ah" 像这样子,u后边没有参数也不会报错了。

至于选项变量的作用是:

getopts由命令行取得选项,把它放入选项变量中,如果该选项需要额外的参数,参数值会放入optarg这个变量中。

例子:

[[email#160;protected]~]#./opt.sh-a
提供了选项a
[[email#160;protected]~]#./opt.sh-h
提供了选项h
[[email#160;protected]~]#./opt.sh-a-h
提供了选项a
提供了选项h
[[email#160;protected]~]#./opt.sh-u
./opt.sh:optionrequiresanargument--u
[[email#160;protected]~]#./opt.sh-uhello
提供了选项-u和参数:hello
[[email#160;protected]~]#catopt.sh
#!/bin/bash
#
whilegetoptsu:ahopt
do
case$optin
u)
echo"提供了选项-u和参数:$optarg";;
a)
echo"提供了选项a";;
h)
echo"提供了选项h";;
*)
;;
esac
done
[[email#160;protected]~]#

四、建立函数库

如果某些函数经常出现在设计的script中,可以考虑把这些函数抽出来,集中存成一个文件,但这个文件称为函数库。

在命名函数时,函数名称第一个字符使用_(下划线),通常这就代表系统用的函数或变量名称。

在/tmp下建立函数库mylib1.sh

_getip()

{

local tmp r ip #函数内部使用的变量设为私有

[ -z "$1" ] return #如果位置参数$1为空,直接退出

shuzu=() #建立数组变量shuzu,作为传回ip字符串用,初始值设为空数组

tmp=$(ifconfig $1 | grep ‘inet addr‘)

r=${tmp/inet addr:/}

ip=${r/bcast*/}

shuzu=($ip) #将找到的ip设为第一个数组元素,作为函数处理结果的传回值

}

调用函数数据库的语法,. /路径/函数数据库 .也用source来表示

#!/bin/bash

mylib_dir="/tmp" #设置函数库默认路径

if [ ! -d "mylib_dir" ];then

mylib_dir="." #如果默认路径不存在就设为当前目录

fi

. $mylib_dir/mylib1.sh #调用函数库mylib1.sh

_getip eth0 #执行_getip传入的参数是网络接口的名称eth0

ip=${shuzu[0]} #取出代表函数执行结果的数组变量shuzu的第一个元素,设值给变量ip

if [ -n "$ip" ];then #判断$ip是否为空,-z 为空 -n不为空

echo "主机ip是:$ip"

else

echo "找不到ip"

fi

本文出自 “welcome to linux world” 博客,请务必保留此出处http://linuxnote.blog.51cto.com/9876511/1641215

linux shell之七 函数应用

原文地址:http://linuxnote.blog.51cto.com/9876511/1641215

这篇内容就是由软件教程库 小编为各位整理 原文链接:https://www.itjcku.com/9999/1091454.html

阅读全部内容


Tags:函数应用利用运用

返回首页



推荐内容

SkillButton技能冷却

#pragmaonce #include"cocos2d.h" using_ns_cc; classskillbutto ...

sles11启用Xmanager

一:开启xmanager要满足一下2个条件:1.安装了gnome桌面环境,并且默认启动级别为52.ip地址为固定ip地址 ...

linux软件管理之rpm、yum

应用程序: 程序:architecturec语言:源代码——》(编译)二进制格式脚本:解释器(二进制程序)源代码——》编 ...

MyEclipse2014下搭建Android开发环境

1、下载android-sdk_r24.1.2-windows.zip,将其解压到一个文件夹中,例如:d:\progra ...

LinuxShell之八转向的用法

一、文件代码“转向”的意思是说:原本应由标准输入(如键盘)读取数据的,改由其它文件读取;原本应把结果显示在标准输出(如屏 ...

Java中有关null的9件事

java中有关 null 的9件事 对于java程序员来说,null是令人头痛的东西。时常会受到空指针异常(np ...

LDAP账号同步和Windows域集成验证

#65279;#65279; paradise.ezla.com.tw/files/article/html/32/32 ...

在同一个sql语句中如何写不同条件的count数量(转)

select sum(case when (t.条件字段=‘00‘) then 1 else 0 ...

详解MessageBox(),MsgBox函数的正确使用

//或者使用chr(13),chr(10)效果一样 msgbox aamp;chr(13)amp;bamp;chr( ...

swift学习笔记5

五、集合 数组 1、泛型 arraylt;类型gt; 2、简化[类型] var myar:arraylt;stringg ...

约在CBD,吃饭

午饭当然是外卖。 cbd上班的同仁们不用约,都去了一间叫大食堂的餐厅。 它在商业街繁华地段的二楼,有1000平米。你不知 ...

headFirst学习笔记之十:状态模式(5.2)

1.如何从状态图得到真正的代码: (1)找出所有状态:没有25分钱,有25分钱,糖果售罄,售出糖果。 (2)创建一个实例 ...

zabbixPHPdatabasessupportoffFail

zabbix初始化检查安装环境不通过: php databases support off fail --未找到所 ...

JS中字符串,数组常见操作

字符串mdash;mdash;mdash;》数组 abc =gt; ["a","b","c"]直接使用split方法 ...

IOS简单的动画自定义方法(旋转、移动、闪烁等)

#define kdegreestoradian(x) (m_pi * (x) /180.0) #define kra ...

swift学习笔记3-4

再牛逼的梦想,也抵不住你傻逼似的坚持! 我跑啊跑啊,为的就是赶上那个被寄予厚望的自己。 三、运算符+表达式 swift允 ...

Trie树初学

#includelt;cstdiogt; #includelt;cstringgt; #includelt;cstdli ...

Android--状态栏高度

干货 classlt;gt; c = null; object obj = null; field field = n ...

//hdu2222//AC自动机初学

// hdu2222 // #includelt;cstdiogt; #includelt;cstringgt; #in ...

黑书笔记

就从p77开始记好了.(稍微扩容) p77 排序. 1.香农信息论 基于比较的排序不可能突破o(nlogn)的复杂度限制 ...

//codeforces471D//kmp初学

// codeforces 471d // #includelt;cstdiogt; #includelt;cstrin ...

搭建基于域名虚拟主机

修改主配置文件 # cd /etc/httpd/conf.d/ # vim vhost.conf lt;virtu ...

Mysql5.6.24zip解压缩版配置及修改默认编码方法

win64位下载地址: http://dev.mysql.com/downloads/file.phpid=456319 ...

图片的预加载和按需加载

图片预加载 lt;!doctype htmlgt; lt;htmlgt; lt;headgt; lt;meta htt ...

iPhone/iPad程序怎么禁止自动休眠

//禁止自动休眠可以通过这一句话搞定:[uiapplication sharedapplication].idletim ...

普林斯顿《算法II》第一周学习笔记UndirectedGraph

普林斯顿的算法课是cousera上评价挺高的一门课,课程的教学语言用的是java,课程中的算法都会被封装成类的形式,对于 ...

headFirst学习笔记之九:迭代器与组合模式(5.1)

1.任务: 大新闻!对象村餐厅和对象村煎饼屋合并了!可以在同一个地方吃早饭和午饭了hohoho(有什么好开森的对象村的小 ...

IOSapplicationWillResignActive

一、挂起当有电话进来或者锁屏,这时你的应用程会挂起,在这时,uiapplicationdelegate委托会收到通知,调 ...

哥我要向前看了

七年前的五一节前的那个周六,我遇到生命中一个重要的人。虽然相处短暂,好梦不长,但是回忆丰满,念念不忘。 七年后的五一节, ...

GoldSmith第二章

uhf:特高频 300m-3000mhz shf:超高频 3g-30g 所有发射与接收的信号都是实信号(因为调制器的振荡 ...


本网站部分内容来自互联网,版权归原作者所有,文章内容仅代表原作者个人观点。如有侵权请联系我们删除 电子邮件 itjcku@foxmail.com