shell中的函数

摘要:函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。格式: function f_name() {                   //function是可以省略的,函数名f_name最好不要跟shell中的关键词冲突    command            } 函数必须要放在最前面,如果调用函数时发现还没定义函数,就会报错 示例1 #!/bin/bash ....

函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。格式:

functionf_name(){//function是可以省略的,函数名f_name最好不要跟shell中的关键词冲突 command }

002UASMrzy7605pjKJv15&690.jpg

函数必须要放在最前面,如果调用函数时发现还没定义函数,就会报错

示例1

#!/bin/bash inp(){ echo$1$2$0$#//$0表示脚本名字,$#表示参数个数 } inp1a2//使用函数名来调用函数,后面跟需要用的参数

执行结果如下:

[root@lijie-01shell]#sh-xfun1.sh +inp1a2 +echo1afun1.sh3 1afun1.sh3 [root@lijie-01shell]#

我们将上面的脚本修改如下:

#!/bin/bash functioninp(){ echo"Thefirstparis$1" echo"Thesecondparis$2" echo"Thescriptnameis$0" echo"Thenumbersofparis$#" } inp1a2b

执行结果如下:

[root@lijie-01shell]#sh-xfun1.sh +inp1a2b +echo\'Thefirstparis1\' Thefirstparis1 +echo\'Thesecondparisa\' Thesecondparisa +echo\'Thescriptnameisfun1.sh\' Thescriptnameisfun1.sh +echo\'Thenumbersofparis4\' Thenumbersofparis4 [root@lijie-01shell]#shfun1.sh Thefirstparis1 Thesecondparisa Thescriptnameisfun1.sh Thenumbersofparis4 [root@lijie-01shell]#

我们再来修改下这个脚本,调用函数的参数也可以使用$1$2这种形式

#!/bin/bash functioninp(){ echo"Thefirstparis$1" echo"Thesecondparis$2" echo"Thescriptnameis$0" echo"Thenumbersofparis$#" } inp$1$2//这里的$1$2指的就是给整个脚本传递的参数

执行过程看下面:

[root@lijie-01shell]#sh-xfun1.sh//不带参数执行,返回的结果如下 +inp +echo\'Thefirstparis\' Thefirstparis +echo\'Thesecondparis\' Thesecondparis +echo\'Thescriptnameisfun1.sh\' Thescriptnameisfun1.sh +echo\'Thenumbersofparis0\' Thenumbersofparis0 [root@lijie-01shell]#sh-xfun1.sh1//带1个参数执行,返回的结果如下 +inp1 +echo\'Thefirstparis1\' Thefirstparis1 +echo\'Thesecondparis\' Thesecondparis +echo\'Thescriptnameisfun1.sh\' Thescriptnameisfun1.sh +echo\'Thenumbersofparis1\' Thenumbersofparis1 [root@lijie-01shell]# 示例2:两个数之和

#!/bin/bash sum(){ s=$[$1+$2] echo$s } sum110

执行结果如下:

[root@lijie-01shell]#sh-x!$ sh-xfun2.sh +sum110 +s=11 +echo11 11 [root@lijie-01shell]# 示例3输入网卡名字显示网卡IP

分析:比如,我这台虚拟主机有以下网卡

[root@lijie-01shell]#ifconfig ens33:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet192.168.75.136netmask255.255.255.0broadcast192.168.75.255 inet6fe80::8ace:f0ca:bb6e:d1f0prefixlen64scopeid0x20<link> inet6fe80::d652:b567:6190:8f28prefixlen64scopeid0x20<link> ether00:0c:29:21:5e:c0txqueuelen1000(Ethernet) RXpackets196221bytes15057853(14.3MiB) RXerrors0dropped0overruns0frame0 TXpackets191762bytes39138157(37.3MiB) TXerrors0dropped0overruns0carrier0collisions0 ens33:0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet192.168.75.150netmask255.255.255.0broadcast192.168.75.255 ether00:0c:29:21:5e:c0txqueuelen1000(Ethernet) ens37:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 ether00:0c:29:21:5e:catxqueuelen1000(Ethernet) RXpackets1018bytes101956(99.5KiB) RXerrors0dropped0overruns0frame0 TXpackets0bytes0(0.0B) TXerrors0dropped0overruns0carrier0collisions0 lo:flags=73<UP,LOOPBACK,RUNNING>mtu65536 inet127.0.0.1netmask255.0.0.0 inet6::1prefixlen128scopeid0x10<host> looptxqueuelen1(LocalLoopback) RXpackets800280bytes230505908(219.8MiB) RXerrors0dropped0overruns0frame0 TXpackets800280bytes230505908219.8MiB) TXerrors0dropped0overruns0carrier0collisions0

下面我们想要通过网卡名字找出对应的IP,我们就可以通过一个函数来表示

#!/bin/bash ip(){ ifconfig|grep-A1"$1:"|grep\'inet\'|awk\'{print$2}\'//-A1显示关键词的这一行及下一行,这行代码的含义在下个代码块解析 } read-p"Pleaseinputtheethname:"e myip=`ip$e` echo"$eaddressis$myip"

我们来看上面脚本的执行结果

[root@lijie-01shell]#shfun3.sh Pleaseinputtheethname.ens33 192.168.75.136 [root@lijie-01shell]#vimfun3.sh [root@lijie-01shell]#shfun3.sh Pleaseinputtheethname.ens33:0 192.168.75.150 [root@lijie-01shell]#shfun3.sh//由于ens37没有IP,因此没有输出 Pleaseinputtheethname.ens37 [root@lijie-01~]#

下面我们一步步来看关键代码的执行

[root@lijie-01~]#ifconfig|grep"ens33"//过滤出包含ens33的行,结果出现两行,不是我们想要的 ens33:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 ens33:0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 [root@lijie-01~]#ifconfig|grep"ens33:"//给过滤词后面增加:来精准识别到我们想要的行 ens33:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 [root@lijie-01~]#ifconfig|grep-A1"ens33:"//加上-A1会显示我们识别到的行及其下一行 ens33:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet192.168.75.136netmask255.255.255.0broadcast192.168.75.255 [root@lijie-01~]#ifconfig|grep-A1"ens33:"|grep\'inet\'//将上一步过滤出来的结果选择包含inet的行 inet192.168.75.136netmask255.255.255.0broadcast192.168.75.255 [root@lijie-01~]#ifconfig|grep-A1"ens33:"|grep\'inet\'|awk\'{print$2}\'//将上面的结果的第二段打印出来 192.168.75.136 [root@lijie-01~]#

下面我们来进一步给上一个shell加入判断条件:判断输入的网卡是不是系统的网卡,判断输入的网卡有没有IP 得到的代码段如下: