case在脚本中添加开关

Shell Me, Lius 1148℃ 0评论

开关(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在脚本中添加开关

喜欢 (0)

发表回复