shell 函数编程
函数语法
语法: function F_NAME { 函数体 } F_NAME() { 函数体 } 可调用:使用函数名 函数名出现的地方,会被自动替换为函数; 脚本: 函数的返回值: 函数的执行结果返回值:代码的输出 函数中的打印语句:echo, print 函数中调用的系统命令执行后返回的结果 执行状态返回值: 函数体中最后一次执行的命令状态结果 自定函数执行状态的返回值:return # 函数可以接受参数: 在函数体中调用函数参数的方式同脚本中调用脚本参数的方式:位置参数 $1, $2, ... $#, $*, $@
简单示例
#!/bin/bash # # chkconfig: 2345 67 34 # srvName=$(basename $0) lockFile=/var/lock/subsys/$srvName start() { if [ -f $lockFile ];then echo "$srvName is already running." return 1 else touch $lockFile [ $? -eq 0 ] && echo "Starting $srvName OK." return 0 fi } stop() { if [ -f $lockFile ];then rm -f $lockFile &> /dev/null [ $? -eq 0 ] && echo "Stop $srvName OK" && return 0 else echo "$srvName is not started." return 1 fi } status() { if [ -f $lockFile ]; then echo "$srvName is running." else echo "$srvName is stopped." fi return 0 } usage() { echo "Usage: $srvName {start|stop|restart|status}" return 0 } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) usage exit 1 ;; esac
break与continue
循环控制: continue: 提前进入下一轮循环 用于条件语句中,仅在某些个特殊场景提前进入; break [n]:跳出当前循环 用于条件语句中, 例如:查看用户登录 #!/bin/bash # read -p "Plz enter a username: " userName while true; do if who | grep "\<$userName\>" &> /dev/null; then break fi echo "not here." sleep 5 done echo "$userName is logged on." #!/bin/bash # read -p "Plz enter a username: " userName until who | grep "\<$userName\>" &> /dev/null; do sleep 5 echo "not here" done echo "here"