在脚本中使用case结构:
case ${VAR_NAME} in
PATTERN1)
COMMAND
...
;;
PATTERN2)
COMMAND
...
;;
...
esac
PATTERN(模式)可以是下列几类字符:
1.普通的文本字符
2.Globbing风格的通配符:
*:任意长度的任意字符
?:任意单个字符;
[]:指定范围内的任意单个字符;
[^]:指定范围以外的任意单个字符;
3.|
或字符
if的多分支结构和case的选择分支结构的异同:
相同点:
1.判断的条件为真时,才会执行对应分支中的语句;条件为假,就跳过不执行;
2.都可以设置默认分支语句,即:所有给定的条件的判断都为假时,才会执行的语句;
不同点:
1.if是根据命令的执行状态返回值的真或假来判断执行某个分支中的语句;
case是根据变量中所保存的值与指定的模式匹配的结果的真或假来判断是否该执行某个分支中的语句;
2.if的每个分支中无需单独到的结束标记,case的每个分支都必须以;;结束;
编写管理用户账户的脚本,第四版,利用case语句+for循环,同时接受创建和删除用户的操作;
#!/bin/bash
#
#helps函数,显示提示信息和帮助信息
helps(){
echo -e "Usage: $(basename $0) options... USERLIST\n"
echo -e " Options: "
echo -e " -a, --add: \vAdd some users from USERLIST."
echo -e " -d, --delete: \vDelete some users from USERLIST."
echo -e " -h, --help: \vPrint help informationn."
echo -e " -v, --verbose: \vPrint more informationn about manage users."
echo
echo -e " USERLIST FORMAT: "
echo -e " USERNAME1,USERNAME2,...,USERNAMEN"
}
#输入的选项的个数
if [ $# -lt 1 ] ; then
helps
exit 5
fi
ADDUSER=0
DELUSER=0
DEBUG=0
#对选项进行筛选执行
for I in $(seq $#) ; do
if [ $# -ne 0 ] ;then
case $1 in
-h|--help)
helps
exit 0
;;
-v|--verbose)
DEBUG=1
shift
;;
-a|--add)
ADDUSERLIST=$2
ADDUSER=1
shift 2
;;
-d|--delete)
DELUSERLIST=$2
DELUSER=1
shift 2
;;
*)
helps
exit 6
;;
esac
fi
done
#执行添加用户的操作
if [ $ADDUSER -eq 1 ] ; then
for J in $(echo $ADDUSERLIST | tr ',' ' ') ; do
if ! id $J &> /dev/null ; then
useradd $J &> /dev/null
echo $J | passwd --stdin $J &> /dev/null
[ $DEBUG -eq 1 ] && echo "Create user $J successfully."
else
echo "$J exist already."
fi
done
fi
#执行删除用户操作
if [ $DELUSER -eq 1 ] ; then
for J in $(echo $DELUSERLIST | tr ',' ' ') ; do
if id $J &> /dev/null ; then
userdel -r $J &> /dev/null
[ $DEBUG -eq 1 ] && echo "Delete user $J finished."
else
echo "$J does not exist yet."
fi
done
fi
#无论选项位置是先-a或者后-a都会先执行添加用户操作,因为添加用户的操作执行在前边,顺序执行脚本的内容。
while循环结构