系统运维-16-1-Bash编程中函数的使用

本文详细介绍Bash脚本中函数的使用技巧,包括函数创建、返回值处理、与循环结合使用、服务脚本编写、参数传递、局部变量作用及递归函数应用,通过实例深入解析Bash函数的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.以简单的用户创建函数为例先简单介绍。

vim function1.sh编辑脚本。bash -n function1.sh检查脚本。bash -x function1.sh执行脚本并输出过程(可以看到这里只执行了赋值,而没有执行函数)。cat function1.sh查看脚本(只定义了函数并没有调用)。vim function1.sh编辑脚本。bash -x function1.sh执行脚本并输出过程(这次函数被执行)。cat function1.sh查看脚本(在脚本的最后调用了函数)。

[root@lab1 ~]# vim function1.sh
[root@lab1 ~]# bash -n function1.sh
[root@lab1 ~]# bash -x function1.sh
+ username=myuser
[root@lab1 ~]# cat function1.sh
#!/bin/bash
#
username='myuser'
function adduser {
  if id $username &> /dev/null; then
    echo "$username exists."
  else
    useradd $username
    [ $? -eq 0 ] && echo "Add $username finished."
  fi

[root@lab1 ~]# vim function1.sh
[root@lab1 ~]# bash -x function1.sh
+ username=myuser
+ adduser
+ id myuser
+ useradd myuser
+ '[' 0 -eq 0 ']'
+ echo 'Add myuser finished.'
Add myuser finished.

[root@lab1 ~]# cat function1.sh
#!/bin/bash
#
username='myuser'
function adduser {
  if id $username &> /dev/null; then
    echo "$username exists."
  else
    useradd $username
    [ $? -eq 0 ] && echo "Add $username finished."
  fi

adduser

 

2.关于函数返回值

vim function1.sh再次编辑脚本。bash -x function1.sh执行脚本并输出(最后多了一个参数0)。cat function1.sh查看脚本(增加了显示返回值)。vim function1.sh再次编辑脚本。bash -x function1.sh执行脚本并输出(返回值为1)。userdel -r myuser删除用户。bash -x function1.sh执行脚本并输出(返回值为0)。cat function1.sh查看脚本(增加了不同执行情况下显示不同返回值)。

[root@lab1 ~]# vim function1.sh
[root@lab1 ~]# bash -x function1.sh
+ username=myuser
+ adduser
+ id myuser
+ echo 'myuser exists.'
myuser exists.
+ echo 0
0
[root@lab1 ~]# cat function1.sh
#!/bin/bash
#
username='myuser'
function adduser {
  if id $username &> /dev/null; then
    echo "$username exists."
  else
    useradd $username
    [ $? -eq 0 ] && echo "Add $username finished."
  fi

adduser
echo $?

[root@lab1 ~]# vim function1.sh
[root@lab1 ~]# bash -x function1.sh
+ username=myuser
+ adduser
+ id myuser
+ echo 'myuser exists.'
myuser exists.
+ return 1
+ echo 1
1
[root@lab1 ~]# userdel -r myuser
[root@lab1 ~]# bash -x function1.sh
+ username=myuser
+ adduser
+ id myuser
+ useradd myuser
+ '[' 0 -eq 0 ']'
+ echo 'Add myuser finished.'
Add myuser finished.
+ return 0
+ echo 0
0
[root@lab1 ~]# cat function1.sh
#!/bin/bash
#
username='myuser'
function adduser {
  if id $username &> /dev/null; then
    echo "$username exists."
    return 1
  else
    useradd $username
    [ $? -eq 0 ] && echo "Add $username finished." && return 0
  fi

adduser
echo $?
 

3.循环与函数的结合使用

vim function1.sh编辑脚本。bash -n function1.sh检查脚本。bash function1.sh执行脚本。cat function1.sh查看脚本(这里通过使用for循环,反复调用函数来创建用户)。

[root@lab1 ~]# vim function1.sh
[root@lab1 ~]# bash -n function1.sh
[root@lab1 ~]# bash function1.sh
Add myuser1 finished.
Add myuser2 finished.
Add myuser3 finished.
Add myuser4 finished.
Add myuser5 finished.
Add myuser6 finished.
Add myuser7 finished.
Add myuser8 finished.
Add myuser9 finished.
Add myuser10 finished.
[root@lab1 ~]# cat function1.sh
#!/bin/bash
#
function adduser {
  if id $username &> /dev/null; then
    echo "$username exists."
    return 1
  else
    useradd $username
    [ $? -eq 0 ] && echo "Add $username finished." && return 0
  fi

for i in {1..10}; do
  username=myuser$i
  adduser
done
 

4.关于服务的简答脚本

vim testsvc.sh编辑脚本。bash -n testsvc.sh检查脚本。chmod +x testsvc.sh赋予脚本执行权限。cp testsvc.sh /etc/rc.d/init.d/testsvc移到启动目录。 ll /etc/rc.d/init.d/testsvc确认具有执行权限。chkconfig --add testsvc添加到服务管理中。 chkconfig --list testsvc查看服务信息。service testsvc status查看服务状态。service testsvc start启动服务。ls /var/lock/subsys/确认目录下的文件。service testsvc restart测试重启。service testsvc stop测试关闭。service testsvc start测试启动。service testsvc start再次启动时显示已经启动。cat testsvc.sh查看脚本(使用函数和case完成脚本)。

[root@lab1 ~]# vim testsvc.sh
[root@lab1 ~]# bash -n testsvc.sh
[root@lab1 ~]# chmod +x testsvc.sh
[root@lab1 ~]# cp testsvc.sh /etc/rc.d/init.d/testsvc
[root@lab1 ~]# ll /etc/rc.d/init.d/testsvc
-rwxr-xr-x. 1 root root 766 Jan  5 22:20 /etc/rc.d/init.d/testsvc
[root@lab1 ~]# chkconfig --add testsvc
[root@lab1 ~]# chkconfig --list testsvc

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

testsvc            0:off    1:off    2:off    3:off    4:off    5:off    6:off
[root@lab1 ~]# service testsvc status
testsvc is stopped.
[root@lab1 ~]# service testsvc start
Starting testsvc finished.
[root@lab1 ~]# ls /var/lock/subsys/
network  testsvc
[root@lab1 ~]# service testsvc restart
Stop testsvc ok.
Starting testsvc finished.
[root@lab1 ~]# service testsvc stop
Stop testsvc ok.
[root@lab1 ~]# service testsvc start
Starting testsvc finished.
[root@lab1 ~]# service testsvc start
testsvc is already running.

[root@lab1 ~]# cat testsvc.sh 
#!/bin/bash
#
# chkconfig: - 88 12
# description: test service script
#
prog=$(basename $0)
lockfile=/var/lock/subsys/$prog

start() {
  if [ -e $lockfile ]; then
    echo "$prog is already running."
    return 0
  else
    touch $lockfile
    [ $? -eq 0 ] && echo "Starting $prog finished."
  fi
}

stop() {
  if [ -e $lockfile ]; then 
    rm -f $lockfile && echo "Stop $prog ok."
  else
    echo "$prog is stopped yet."
  fi
}

status() {
  if [ -e $lockfile ]; then
    echo "$prog is running."
  else
    echo "$prog is stopped."
  fi
}

usage() {
  echo "Usage: $prog {start|stop|restart|status}"
}

if [ $# -lt 1 ]; then
  usage
  exit 1
fi

case $1 in
start)
  start
  ;;
stop)
  stop
  ;;
restart)
  stop
  start
  ;;
status)
  status
  ;;
*)
  usage
esac 
 

5.关于函数的参数

vim function2.sh编辑脚本。bash -n function2.sh检查脚本。bash -x function2.sh执行脚本并输出过程。cat function2.sh查看脚本(这里使用了$1这个参数)。

[root@lab1 ~]# vim function2.sh
[root@lab1 ~]# bash -n function2.sh
[root@lab1 ~]# bash -x function2.sh
+ for i in '{1..10}'
+ adduser myuser1
+ '[' 1 -lt 1 ']'
+ id myuser1
+ echo 'myuser1 exists.'
myuser1 exists.
+ return 1
+ for i in '{1..10}'
+ adduser myuser2
+ '[' 1 -lt 1 ']'
+ id myuser2
+ echo 'myuser2 exists.'
myuser2 exists.
+ return 1
+ for i in '{1..10}'
+ adduser myuser3
+ '[' 1 -lt 1 ']'
+ id myuser3
+ echo 'myuser3 exists.'
myuser3 exists.
+ return 1
+ for i in '{1..10}'
+ adduser myuser4
+ '[' 1 -lt 1 ']'
+ id myuser4
+ echo 'myuser4 exists.'
myuser4 exists.
+ return 1
+ for i in '{1..10}'
+ adduser myuser5
+ '[' 1 -lt 1 ']'
+ id myuser5
+ echo 'myuser5 exists.'
myuser5 exists.
+ return 1
+ for i in '{1..10}'
+ adduser myuser6
+ '[' 1 -lt 1 ']'
+ id myuser6
+ echo 'myuser6 exists.'
myuser6 exists.
+ return 1
+ for i in '{1..10}'
+ adduser myuser7
+ '[' 1 -lt 1 ']'
+ id myuser7
+ echo 'myuser7 exists.'
myuser7 exists.
+ return 1
+ for i in '{1..10}'
+ adduser myuser8
+ '[' 1 -lt 1 ']'
+ id myuser8
+ echo 'myuser8 exists.'
myuser8 exists.
+ return 1
+ for i in '{1..10}'
+ adduser myuser9
+ '[' 1 -lt 1 ']'
+ id myuser9
+ echo 'myuser9 exists.'
myuser9 exists.
+ return 1
+ for i in '{1..10}'
+ adduser myuser10
+ '[' 1 -lt 1 ']'
+ id myuser10
+ echo 'myuser10 exists.'
myuser10 exists.
+ return 1
[root@lab1 ~]# cat function2.sh
#!/bin/bash
#
function adduser {
  if [ $# -lt 1 ]; then
    return 2
    # 2: no arguments
  fi

  if id $1 &> /dev/null; then
    echo "$1 exists."
    return 1
  else
    useradd $1
    [ $? -eq 0 ] && echo "Add $1 finished." && return 0
  fi

for i in {1..10}; do
  adduser myuser$i
done
 

6.关于函数的局部变量

vim function3.sh编辑脚本。bash -n function3.sh检查脚本。bash -x function3.sh执行脚本并输出过程。cat function3.sh查看脚本(局部变量与全局变量最终执行的结果相同,这里函数内部没有参数值时会从全局中调用)。vim function3.sh编辑脚本。bash function3.sh执行脚本(局部变量与全局变量最终执行的结果不相同)。cat function3.sh查看脚本(此时在函数中进行了局部变量赋值)。

[root@lab1 ~]# vim function3.sh
[root@lab1 ~]# bash -n function3.sh
[root@lab1 ~]# bash -x function3.sh
+ declare -i i=6
+ f1
+ let i++
+ echo 'Function: 7'
Function: 7
+ echo 'Main: 7'
Main: 7

[root@lab1 ~]# cat function3.sh
#!/bin/bash
#
declare -i i=6

f1() {
  let i++
  echo "Function: $i"
}

f1
echo "Main: $i"

[root@lab1 ~]# vim function3.sh
[root@lab1 ~]# bash function3.sh
Function: 10
Main: 6
[root@lab1 ~]# cat function3.sh
#!/bin/bash
#
declare -i i=6

f1() {
  local i=9
  let i++
  echo "Function: $i"
}

f1
echo "Main: $i"
 

7.关于函数的递归(阶乘与斐波那契数列的两个例子)

vim fact.sh编辑脚本。bash -n fact.sh检查脚本。bash -x fact.sh执行脚本并输出过程。cat fact.sh查看脚本(阶乘运算过程)。

[root@lab1 ~]# vim fact.sh
[root@lab1 ~]# bash -n fact.sh
[root@lab1 ~]# bash -x fact.sh
+ fact 5
+ '[' 5 -eq 0 -o 5 -eq 1 ']'
++ fact 4
++ '[' 4 -eq 0 -o 4 -eq 1 ']'
+++ fact 3
+++ '[' 3 -eq 0 -o 3 -eq 1 ']'
++++ fact 2
++++ '[' 2 -eq 0 -o 2 -eq 1 ']'
+++++ fact 1
+++++ '[' 1 -eq 0 -o 1 -eq 1 ']'
+++++ echo 1
++++ echo 2
+++ echo 6
++ echo 24
+ echo 120
120
[root@lab1 ~]# cat fact.sh
#!/bin/bash
#
fact() {
  if [ $1 -eq 0 -o $1 -eq 1 ]; then
    echo 1
  else
    echo $[$1*$(fact $[$1-1])]
  fi
}

fact 5

vim fab.sh编辑脚本。bash -n fab.sh检查脚本。bash -x fab.sh执行脚本并输出过程。cat fab.sh查看脚本内容(斐波那契数列运算)。

[root@lab1 ~]# vim fab.sh
[root@lab1 ~]# bash -n fab.sh 
[root@lab1 ~]# bash -x fab.sh 
+ fab 7
+ '[' 7 -eq 1 ']'
+ '[' 7 -eq 2 ']'
++ fab 6
++ '[' 6 -eq 1 ']'
++ '[' 6 -eq 2 ']'
+++ fab 5
+++ '[' 5 -eq 1 ']'
+++ '[' 5 -eq 2 ']'
++++ fab 4
++++ '[' 4 -eq 1 ']'
++++ '[' 4 -eq 2 ']'
+++++ fab 3
+++++ '[' 3 -eq 1 ']'
+++++ '[' 3 -eq 2 ']'
++++++ fab 2
++++++ '[' 2 -eq 1 ']'
++++++ '[' 2 -eq 2 ']'
++++++ echo 1
++++++ fab 1
++++++ '[' 1 -eq 1 ']'
++++++ echo 1
+++++ echo 2
+++++ fab 2
+++++ '[' 2 -eq 1 ']'
+++++ '[' 2 -eq 2 ']'
+++++ echo 1
++++ echo 3
++++ fab 3
++++ '[' 3 -eq 1 ']'
++++ '[' 3 -eq 2 ']'
+++++ fab 2
+++++ '[' 2 -eq 1 ']'
+++++ '[' 2 -eq 2 ']'
+++++ echo 1
+++++ fab 1
+++++ '[' 1 -eq 1 ']'
+++++ echo 1
++++ echo 2
+++ echo 5
+++ fab 4
+++ '[' 4 -eq 1 ']'
+++ '[' 4 -eq 2 ']'
++++ fab 3
++++ '[' 3 -eq 1 ']'
++++ '[' 3 -eq 2 ']'
+++++ fab 2
+++++ '[' 2 -eq 1 ']'
+++++ '[' 2 -eq 2 ']'
+++++ echo 1
+++++ fab 1
+++++ '[' 1 -eq 1 ']'
+++++ echo 1
++++ echo 2
++++ fab 2
++++ '[' 2 -eq 1 ']'
++++ '[' 2 -eq 2 ']'
++++ echo 1
+++ echo 3
++ echo 8
++ fab 5
++ '[' 5 -eq 1 ']'
++ '[' 5 -eq 2 ']'
+++ fab 4
+++ '[' 4 -eq 1 ']'
+++ '[' 4 -eq 2 ']'
++++ fab 3
++++ '[' 3 -eq 1 ']'
++++ '[' 3 -eq 2 ']'
+++++ fab 2
+++++ '[' 2 -eq 1 ']'
+++++ '[' 2 -eq 2 ']'
+++++ echo 1
+++++ fab 1
+++++ '[' 1 -eq 1 ']'
+++++ echo 1
++++ echo 2
++++ fab 2
++++ '[' 2 -eq 1 ']'
++++ '[' 2 -eq 2 ']'
++++ echo 1
+++ echo 3
+++ fab 3
+++ '[' 3 -eq 1 ']'
+++ '[' 3 -eq 2 ']'
++++ fab 2
++++ '[' 2 -eq 1 ']'
++++ '[' 2 -eq 2 ']'
++++ echo 1
++++ fab 1
++++ '[' 1 -eq 1 ']'
++++ echo 1
+++ echo 2
++ echo 5
+ echo 13
13
[root@lab1 ~]# cat fab.sh
#!/bin/bash
#
fab() {
  if [ $1 -eq 1 ]; then
    echo 1
  elif [ $1 -eq 2 ]; then
    echo 1
  else
    echo $[$(fab $[$1-1])+$(fab $[$1-2])]
  fi
}

fab 7
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值