bash中while,until,case,select语句结构

前端之家收集整理的这篇文章主要介绍了bash中while,until,case,select语句结构前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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:\vAddsomeusersfromUSERLIST."
echo-e"-d,--delete:\vDeletesomeusersfromUSERLIST."
echo-e"-h,--help:\vPrinthelpinformationn."
echo-e"-v,--verbose:\vPrintmoreinformationnaboutmanageusers."
echo
echo-e"USERLISTFORMAT:"
echo-e"USERNAME1,USERNAME2,...,USERNAMEN"
}
#输入的选项的个数
if[$#-lt1];then
helps
exit5
fi
ADDUSER=0
DELUSER=0
DEBUG=0
#对选项进行筛选执行
forIin$(seq$#);do
if[$#-ne0];then
case$1in
-h|--help)
helps
exit0
;;
-v|--verbose)
DEBUG=1
shift
;;
-a|--add)
ADDUSERLIST=$2
ADDUSER=1
shift2
;;
-d|--delete)
DELUSERLIST=$2
DELUSER=1
shift2
;;
*)
helps
exit6
;;
esac
fi
done
#执行添加用户的操作
if[$ADDUSER-eq1];then
forJin$(echo$ADDUSERLIST|tr',''');do
if!id$J&>/dev/null;then
useradd$J&>/dev/null
echo$J|passwd--stdin$J&>/dev/null
[$DEBUG-eq1]&&echo"Createuser$Jsuccessfully."
else
echo"$Jexistalready."
fi
done
fi
#执行删除用户操作
if[$DELUSER-eq1];then
forJin$(echo$DELUSERLIST|tr',''');do
ifid$J&>/dev/null;then
userdel-r$J&>/dev/null
[$DEBUG-eq1]&&echo"Deleteuser$Jfinished."
else
echo"$Jdoesnotexistyet."
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-iI=0
until[$I-eq100];do
letI++
letSUM+=$I
done
echo$SUM


#!/bin/bash
#
declare-iI=0
while[$I-lt100];do
letI++
letSUM+=$I
done
echo$SUM

循环控制语句:
continue
continue: continue [n]
Resume for,while,or until loops.
提前结束第n层当前循环,直接进入下一轮条件判断,如果条件判断结果仍然满足循环进入条件,则开启下一轮循环;

break
break: break [n]
Exit for,or until loops.

提前结束第n层的循环,而且不再继续后续循环;

while和until的两种特殊循环使用方法
1.无限循环方法
while true ; do
COMMANDS
done

until false ; do
COMMANDS
done

猜数字游戏

#!/bin/bash
#
NUMBER=$[RANDOM%100+1]
whiletrue;do
read-p"Inputanumber:"INPTNUM
if[$INPTNUM-gt$NUMBER];then
echo"Toobig"
elif[$INPTNUM-lt$NUMBER];then
echo"Toosmall"
else
echo"Yes!youWIN.That's$NUMBER."
#在输入数字和随机数字匹配的时候,就退出
break
fi
done
#!/bin/bash
#
NUMBER=$[RANDOM%100+1]
untilfalse;do
read-p"Inputanumber:"INPTNUM
if[$INPTNUM-gt$NUMBER];then
echo"Toobig"
elif[$INPTNUM-lt$NUMBER];then
echo"Toosmall"
else
echo"Yes!youWIN.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退出按钮
selectIin$(awk-F:'/\/bin\/bash$/{print$1}'/etc/passwd)quit;do
case$Iin
quit)
exit
;;
*)
echo"TheUIDof$Iis$(id-u$I)"
;;
esac
done

猜你在找的Bash相关文章