shell高级用法--函数

简介:

在shell中如果一段代码需要反复被调用,则可以将该段代码定义称为函数,直接在后面的脚本中调用即可。定义函数的方法有两种:

1、function  functionname {



}


2、functionname() {


}


例如:定义一个添加用户hadoop的函数

1
2
3
4
5
6
7
8
9
ADDUSER() {
USERNAME=hadoop
if  id  -u $USERNAME &>  /dev/null then
     useradd  $USERNAME
     echo  $USERNAME |  passwd  --stdin $USERNAME &>  /dev/null
fi
}
ADDUSER
echo  $?
1
2
3
4
[root@dnsserver ~] # ./adduser.sh       
0
[root@dnsserver ~] # ./adduser.sh 
0

连续两次执行脚本,返回的状态值都是0,这里有一个问题,第一次执行这个脚本,成功添加了用户hadoop,但是第二次执行时,hadoop已经存在,那么这个为什么还是返回状态值为0?

1
2
3
4
5
6
[root@dnsserver ~] # bash -x adduser.sh 
+ ADDUSER
+ USERNAME=hadoop
id  -u hadoop
echo  0
0

从上面的分析可以看出,由于脚本最后一条命名为id -u hadoop,而该命令是能成功执行的,所以返回值是0。显然,这是不合理的。那么我们如果根据不同的情况,获取不同的状态值呢?

可以利用return命令,在函数中用return来定义函数的状态值。

上面的脚本改成这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
#
ADDUSER() {
USERNAME=hadoop
if  id  -u $USERNAME &>  /dev/null then
     useradd  $USERNAME
     echo  $USERNAME |  passwd  --stdin $USERNAME &>  /dev/null
     return  0
else
     return  1
fi
}
ADDUSER
if  [ $? - eq  0 ];  then
    echo  "add user finished."
else
    echo  "Failed"
fi


删除hadoop用户重新执行看看结果

1
2
3
4
5
[root@dnsserver ~] # userdel -r hadoop
[root@dnsserver ~] # ./adduser.sh     
add user finished.
[root@dnsserver ~] # ./adduser.sh 
Failed

第二次添加用户hadoop的时候就报错了。




接受参数的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
#
ADDUSER() {
USERNAME=$1
if  id  -u $USERNAME &>  /dev/null then
     useradd  $USERNAME
     echo  $USERNAME |  passwd  --stdin $USERNAME &>  /dev/null
     return  0
else
     return  1
fi
}
##调用函数时也要跟$1这个变量
ADDUSER $1  
if  [ $? - eq  0 ];  then
    echo  "add user finished."
else
    echo  "Failed"
fi



练习:写一个脚本,判定192.168.0.200~192.168.0.254之间的主机哪些在线,要求:

1、使用函数来实现一台主机的判定过程:

2、在主程序中调用此函数判定指定范围内的所有主机的在线情况

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
#
PING() {
       if  ping  -c 1 -w 1 192.168.0.$I &>  /dev/null then
           echo  "192.168.0.$I is online."
       else
           echo  "192.168.0.$I is offline."
       fi
}
 
for  in  {200..254};  do
     PING 192.168.0.$I
done

执行脚本

1
2
3
4
5
[root@dnsserver ~] # ./ping.sh 
192.168.0.200 is offline.
192.168.0.201 is offline.
192.168.0.202 is offline.
192.168.0.203 is offline.


这里脚本输出结果返回的信息是由函数PING来显示的,如果不希望函数来显示是否在线,而是由主程序来显示,则可以利用return来改进脚本,改进后的脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#
PING() {
       if  ping  -c 1 -w 1 192.168.0.$I &>  /dev/null then
           return  0
       else
           return  1
       fi
}
for  in  {200..254};  do
     PING 192.168.0.$I
     if  [ $? - eq  0 ];  then
        echo  "192.168.0.$I is online."
     else
        echo  "192.168.0.$I is offline."
     fi
done











本文转自 曾哥最爱 51CTO博客,原文链接:http://blog.51cto.com/zengestudy/1775892,如需转载请自行联系原作者
目录
相关文章
|
18天前
|
存储 运维 Shell
shell中for while until 三种循环的用法
shell编程中,有几种常见的循环结构,包括for循环、while循环和until循环,总的来说,循环shell编程中扮演着至关重要的角色,它们使得自动化任务变得更加容易,提高了效率,并且可以处理各种各样的编程需求。
shell中for while until 三种循环的用法
|
4月前
|
Shell
Shell函数
Shell函数
26 1
|
5月前
|
运维 Shell C语言
运维(14)- shell函数
运维(14)- shell函数
26 0
|
6月前
|
Unix Shell Linux
|
18天前
|
Shell 应用服务中间件 nginx
shell学习(七) 【shell 函数】
shell学习(七) 【shell 函数】
8 1
|
18天前
|
Shell Perl
shell学习(九) 【shell sed用法】
shell学习(九) 【shell sed用法】
9 0
|
1月前
|
Shell C语言 C++
【Shell 编程指南】shell中的(),{}几种语法用法
【Shell 编程指南】shell中的(),{}几种语法用法
17 0
|
4月前
|
存储 Shell
shell函数介绍
shell函数介绍
31 2
|
1月前
|
Shell Linux C语言
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
31 0