Bash编程(二)之if判断与函数
一、if语句
If语句:用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。测试条件,状态返回值为0或为真,则执行选择分支。三种使用格式:单分支、双分支、多分支。
格式:
1、单分支:
if 测试条件;then
选择分支
fi
注意:如果把命令执行成功与否当作条件,则if语句后必须只跟命令本身,而不能引用。
自定义shell进程的状态返回值:
exit [n]
2、双分支:两个分支仅执行其中之一
if 测试条件;then
选择分支1
else
选择分支2
fi
3、多分支:
if 条件1;then
分支1
elif 条件2;then
分支2
elif 条件3;then
分支3
...
else 条件n;then
分支n
fi
注:测试条件:如果不是命令要用[],为命令时不加[]
实际操练一下:
例题:
知识点:位置变量、自定义状态返回值、单分支if语句、多分支if语句。
传递一个用户名给脚本:
如果此用户的id号为0,则显示说这是管理员,如果此用户的id号大于等于500,则显示说这是普通用户。否则,则说这是系统用户
#!/bin/bash
#
if [ $# -lt 1 ]; then
echo"Usage: `basename $0` username"
exit 1 #自定义状态返回值为1
fi
#单分支
#判断是否有参数
if ! id -u $1 &> /dev/null; then
echo"Usage: `basename $0` username"
echo"No this user $1."
exit2 #自定义状态返回值为2
fi
#单分支
#判断用户是否存在
if [ $(id -u $1) -eq 0 ]; then
echo"Admin"
elif [ $(id -u $1) -ge 500 ]; then
echo "Common user."
else
echo"System user."
fi
#多分支
#脚本真正判断用户id
扩展:嵌套的if语句
嵌套的if语句相对复杂一点,当条件1满足时,就运行第一个then后面的语句,在条件1满足后,在判断条件2,当条件1和条件2同时满足的时候就会运行第二个then后面的语句,当只有条件1满足,条件2不满足就会运行第一个else后面的语句,如果条件1都不满足,那就直接运行第二个else后面的语句。
if [ 条件1 ];then
if [ 条件2 ];then
语句...
else
语句.....
fi
else
语句....
Fi
实例:还以上面的例题为例
#!/bin/bash
#
if [ $# -lt 1 ]; then#判断是否有参数
echo"Usage: `basename $0` username"
exit 1 #自定义状态返回值为1
ifid$1&> /dev/null;then#判断用户是否存在
echo "Usage: `basename $0`username"
echo"No this user $1."
exit 2
if [ $(id -u $1) -eq0 ]; then#脚本真正判断用户id
echo "Admin"
elif [ $(id -u $1) -ge 500 ]; then
echo "Common user."
else
echo "System user."
fi
fi
fi
例题2:
知识点:位置变量、文件比较运算、逻辑运算、组合条件测试、自定义状态返回值、多分支if语句。
写一个脚本,使用格式:
script.sh{start|stop|restart|status}
1)start: 创建/var/lock/subsys/script.sh
2)stop: 删除此文件
3)restart: 先删除文件,再创建文件
4)status: 如文件存在,显示running,否则,显示stopped
#!/bin/bash
#
srv=`basename $0`
lockFile="/var/lock/subsys/$srv"
[ $# -lt 1 ] && echo "Usage:$srv {start|stop|restart|status}" && exit 2
[ $UID -ne 0 ] && echo "Onlyroot." && exit 3
if [ "$1" == 'start' ]; then
if[ -f $lockFile ]; then
echo "$srv is running."
exit 4
else
touch $lockFile
[ $? -eq 0 ] && echo "Starting $srv OK."
fi
elif [ "$1" == 'stop' ]; then
if [ -f $lockFile ]; then
rm -f $lockFile
[ $? -eq 0 ] && echo "Stopping $srv OK."
else
echo "$srv is stopped yes."
exit 5
fi
elif [ "$1" == 'restart' ]; then
if [ -f $lockFile ];then
rm -f $lockFile
[ $? -eq 0 ] && echo "Stopping $srv OK."
else
echo "$srv is stopped yet."
fi
touch $lockFile
[$? -eq 0 ] && echo "Starting $srv OK."
elif [ "$1" == 'status' ];then
if [ -f $lockFile ];then
echo "$srv is running."
else
echo "$srv is stopped."
fi
else
echo "Usage: $srv {start|stop|restart|status}" && exit6
fi
二、case语句
case语句:有多个测试条件时,case语句会使得语法结构更明晰,等同于多分支的if语句。
格式:
case $变量引用 in
PATTERN1)
分支1
;;
PATTERN2)
分支2
;;
....
*)
分支n
;;
Esac
实例:
写一个脚本,使用格式:
script.sh{start|stop|restart|status}
1)start: 创建/var/lock/subsys/script.sh
2)stop: 删除此文件
3)restart: 先删除文件,再创建文件
4)status: 如文件存在,显示running,否则,显示stopped
#!/bin/bash
#
srv=`basename $0`
lockFile="/var/lock/subsys/$srv"
[ $# -lt 1 ] && echo "Usage:$srv {start|stop|restart|status}" && exit 4
[ $UID -ne 0 ] && echo "Onlyroot." && exit 5
case $1 in
start)
if[ -f $lockFile ]; then
echo "$srv is running."
exit7
else
touch$lockFile
[$? -eq 0 ] && echo "Starting $srv OK."
fi
;;
stop)
if [ -f $lockFile ]; then
rm-f $lockFile
[$? -eq 0 ] && echo "Stopping $srv OK."
else
echo"$srv is stopped yes."
exit6
fi
;;
restart)
if [ -f $lockFile ];then
rm -f $lockFile
[$? -eq 0 ] && echo "Stopping $srv OK."
else
echo"$srv is stopped yet."
fi
touch $lockFile
[$? -eq 0 ] && echo "Starting $srv OK."
;;
status)
if [ -f $lockFile ];then
echo"$srv is running."
else
echo"$srv is stopped."
fi
;;
*)
echo "Usage: $srv {start|stop|restart|status}" && exit9
三、函数:shell脚本代码可以封装在函数内,而函数可以在脚本任意处使用,由此减少大段代码的重复编写。
格式:
方法一:
funstion F_NAME{
函数体
}
方法二:
F_NAME(){
函数体
}
调用:使用函数名,函数名出现的地方,会被自动替换为函数
函数的返回值:分正常返回值和执行状态返回值。
1、正常返回值:代码的输出
函数中的打印语句:echo ,print
函数中调用的系统命令执行后返回的结果
2、执行状态返回值:
执行状态返回值取决与函数体中最后一次执行的命令状态结果
自定义函数执行状态的返回值: return #
函数的参数:
在函数体中调用函数参数的方式合脚本中调用脚本参数的方式一样(位置参数)
$1,$2, ...
$#,$*, $@
实例:
写一个脚本,使用格式:
script.sh{start|stop|restart|status}
1)start: 创建/var/lock/subsys/script.sh
2)stop: 删除此文件
3)restart: 先删除文件,再创建文件
4)status: 如文件存在,显示running,否则,显示stopped
#!/bin/bash
#
# chkconfig: 2345 67 34
#
srvName=$(basename $0)
lockFile=/var/lock/subsys/$srvName
start() {
if [ -f $lockFile ];then
echo"$srvName is already running."
return1
else
touch$lockFile
[$? -eq 0 ] && echo "Starting $srvName OK."
return0
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."
return1
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
exit1 ;;
esac
转载于:https://blog.51cto.com/linuxgentoo/1535068