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