case语句:
在脚本中使用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循环结构
while: while COMMANDS; do COMMANDS; done
在脚本中可以写成下列结构:
while CONDITION ; do
COMMANDS
done
while循环进入循环的条件:CONDITION逻辑判断结果为真;
while循环退出循环的条件:CONDITION逻辑判断结果为假;
until循环结构
until: until COMMANDS; do COMMANDS; done
在脚本中可以写成下列结构:
until CONDITION ; do
COMMANDS
done
until循环进入循环的条件:CONDITION逻辑判断结果为假;
until循环退出循环的条件:CONDITION逻辑判断结果为真;
注意:
1.while CONDITION 相当于 until ! CONDITION
2.while和until循环结构中,没有变量自增或自减的变化方法,因此需要使用语句手动给出变量的变化方式;
写一个脚本,使用while或until循环,计算100以内整数的和;
#!/bin/bash # #在$I=100的时候,退出循环,否则判断会进入101 declare -i I=0 until [ $I -eq 100 ] ; do let I++ let SUM+=$I done echo $SUM #!/bin/bash # declare -i I=0 while [ $I -lt 100 ] ; do let I++ let SUM+=$I done echo $SUM
循环控制语句:
continue
continue: continue [n]
Resume for, while, or until loops.
提前结束第n层当前循环,直接进入下一轮条件判断,如果条件判断结果仍然满足循环进入条件,则开启下一轮循环;
break
break: break [n]
Exit for, while, or until loops.
提前结束第n层的循环,而且不再继续后续循环;
while和until的两种特殊循环使用方法:
1.无限循环方法:
while true ; do
COMMANDS
done
until false ; do
COMMANDS
done
猜数字游戏:
#!/bin/bash # NUMBER=$[RANDOM%100+1] while true ; do read -p "Input a number: " INPTNUM if [ $INPTNUM -gt $NUMBER ] ; then echo "Too big" elif [ $INPTNUM -lt $NUMBER ] ; then echo "Too small" else echo "Yes! you WIN. That's $NUMBER." #在输入数字和随机数字匹配的时候,就退出 break fi done
#!/bin/bash # NUMBER=$[RANDOM%100+1] until false ; do read -p "Input a number: " INPTNUM if [ $INPTNUM -gt $NUMBER ] ; then echo "Too big" elif [ $INPTNUM -lt $NUMBER ] ; then echo "Too small" else echo "Yes! you WIN. That's $NUMBER." break fi done
注意:在此类循环结构中,需要适当的添加continue或break控制语句,以使得无限循环可控;
2.实现遍历功能的while和until循环结构:
while read LINES ; do
COMMANDS
done < /PATH/FROM/SOMEFILE
until ! read LINES ; do
COMMANDS
done < /PATH/FROM/SOMEFILE
注意:在做遍历循环时,建议使用for;
select循环结构
select: select NAME [in WORDS ... ;] do COMMANDS; done
Select words from a list and execute commands.
select循环也是一种遍历列表的方式创建一个可视化菜单,每个列表项都有一个数字编号与之对应,供用户选择使用;而用户只需要选择其编号即可;
select是一种默认无限循环结构,因此,必须在循环体中为select提供退出循环的条件,通常可以使用break或exit命令实现;
通常情况下,select循环会和case一起使用,已进行合理的取值判断;
在脚本中实现的格式:
select VAR_NAME in LIST ; do
COMMANDS
done
写一个脚本,显示以/bin/bash为默认shell的用户的ID信息;
#!/bin/bash # #挑选用户名或者quit退出按钮 select I in $(awk -F : '/\/bin\/bash$/{print $1}' /etc/passwd) quit ; do case $I in quit) exit ;; *) echo "The UID of $I is $(id -u $I)" ;; esac done