开关(switch)在脚本中使用很多。通常,在特定的条件下,将switch的值做改变,开关的值对后续的代码有直接的影响,从而产生相应的操作。
比如,我们制作一个脚本,当选项是:
-a|--add: 添加用户(参数后的用户列表)
-d|--del: 删除用户
-h|--help: 打印帮助信息
其他:打印帮助信息,提示参数错误。
这时候,显然,case语句适合这么多的选项控制,另外,还要根据参数的不同,来添加不同的开关,脚本如下:
#!/bin/bash
# Usage:
# Date: 2017-12-27
# ScriptName: adduser1.sh
# Author: Liemer_Lius
declare -i ADD=0
declare -i DEL=0
declare -i DEBUG=0
REPEAT=$[$#-1]
for i in `seq $REPEAT`; do
case $1 in
-v|--verbose)
DEBUG=1
shift
;;
-a|--add)
ADD=1
shift
;;
-d|--del)
DEL=1
shift
;;
-h|--help)
echo "Usage: `basename $0` -v|--verbose|-a|--add|-d|--del|-h|--help USER1,USER2,USER3..."
exit 0
;;
*)
echo "Usage: `basename $0` -v|--verbose|-a|--add|-d|--del|-h|--help USER1,USER2,USER3..."
exit 5
;;
esac
done
USERS=`echo $@ |cut -d' ' -f-1 | sed 's@,@ @g'`
if [ $ADD -eq 1 ] && [ $DEL -eq 1 ]; then
echo "Add and delete users can't be exacuted in the same time. Exit!"
exit 7
fi
if [ $ADD -eq 1 ]; then
for k in $USERS; do
if id -u $k &> /dev/null; then
echo "User $k exit. Skip!"
continue
else
useradd -M -s /sbin/nologin $k &> /dev/null
if [ $? -eq 0 ] && [ $DEBUG -eq 1 ]; then
echo "Add user $k finished."
fi
fi
done
elif [ $DEL -eq 1 ]; then
for l in $USERS; do
if ! id -u $l &> /dev/null; then
echo "No user named $l. Exit!"
continue
else
userdel -r $l &> /dev/null
if [ $? -eq 0 ] && [ $DEBUG -eq 1 ]; then
echo "Delete user $l finished."
fi
fi
done
else
echo "Usage: `basename $0` -v|--verbose|-a|--add|-d|--del|-h|--help USER1,USER2,USER3..."
exit 6
fi
执行结果:
[root@rs1 ~]# tail -2 /etc/passwd
nginx:x:497:497:Nginx web server:/var/lib/nginx:/sbin/nologin
lius:x:501:501::/home/lius:/bin/bash
[root@rs1 ~]# ./adduser1.sh -v -a user1,user2
Add user user1 finished.
Add user user2 finished.
[root@rs1 ~]# tail -2 /etc/passwd
user1:x:502:502::/home/user1:/sbin/nologin
user2:x:503:503::/home/user2:/sbin/nologin
[root@rs1 ~]# ./adduser1.sh -v -d user1,user2
Delete user user1 finished.
Delete user user2 finished.
[root@rs1 ~]# tail -2 /etc/passwd
nginx:x:497:497:Nginx web server:/var/lib/nginx:/sbin/nologin
lius:x:501:501::/home/lius:/bin/bash
[root@rs1 ~]# ./adduser1.sh -v -d -a user1,user2
Add and delete users can't be exacuted in the same time. Exit!
[root@rs1 ~]# ./adduser1.sh -v
Usage: adduser1.sh -v|--verbose|-a|--add|-d|--del|-h|--help USER1,USER2,USER3...
[root@rs1 ~]# ./adduser1.sh --help
Usage: adduser1.sh -v|--verbose|-a|--add|-d|--del|-h|--help USER1,USER2,USER3...
注:脚本中有各种判断,add和del不能同时执行,当有-v或–verbose的时候,开关DEBUG=1,决定后续打印用户添加、删除成功的信息。
另外,还可以控制同时进行添加和删除用户,脚本的一部分如下:
#!/bin/bash
# Usage:
# Date: 2017-12-27
# ScriptName: useradmin.sh
# Author: Liemer_Lius
DEBUG=0
ADD=0
DEL=0
for i in `seq 1 $#`; do
if [ $# -gt 0 ]; then
case $1 in
-v|--verbose)
DEBUG=1
shift
;;
-h|--help)
echo "Usage: "
exit 0
;;
-a|--add)
ADD=1
ADDUSERS=$2
shift 2
;;
-d|--del)
DEL=1
DELUSERS=$2
shift 2
;;
*)
echo "Usage: "
exit 7
;;
esac
fi
done
echo $ADD $DEL $DEBUG $ADDUSERS $DELUSERS
在如上的脚本中,-a|–add 后面紧跟的参数就是要添加的用户,-d|–del后面的是要删除的用户列表。
执行结果:
[root@rs1 ~]# ./useradmin.sh -v -a user1,user2 -d user3,user5
1 1 1 user1,user2 user3,user5
由上面的结果可以看到,开关全部打开了,并且两个用户列表也切割出来了。
转载请注明:liutianfeng.com » case在脚本中添加开关
发表回复
要发表评论,您必须先登录。