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: \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
时间: 2024-10-04 22:21:37

bash中while,until,case,select语句结构的相关文章

Oracle中是用case...when语句进行判断

使用case...when语句进行判断,其语法格式如下: case<selector> when<expression_1> then pl_sqlsentence_1; when<expression_2> then pl_sqlsentence_2; ... when<expression_n> then pl_sqlsentence_n; [else plsql_sentence;] end case; 具体例子如下: declare v_season

oracle sql 基础(二):select 语句

为了从数据库中查询数据,你需要用SQL语言中使用最多的SELECT语句.我们分别介绍SELECT语句的基础语法.子查询.从多表中查询数据,然后再进行实例解析. 一.SELECT语句的基础语法 SELECT语句就像叠加在数据库表上的过滤器,即选择查询用于定位数据库特定的列和行.下面是SELECT语句的基础语法.  SELECT [ALL|DISTINCT SELECT_LIST FROM {table_name|view_name} [WHERE search_condition] [GROUP

mysql 查询select语句汇总

数据准备: 创建表: create table students( id int unsigned primary key auto_increment not null, name varchar(20) default '', age tinyint unsigned default 0, height decimal(5,2), gender enum('男','女','人妖','保密'), cls_id int unsigned default 0, isdelete bit defau

【SQL】INSERT INTO SELECT语句与SELECT INTO FROM语句

INSERT INTO SELECT语句与SELECT INTO FROM语句,都是将一个结果集插入到一个表中: #INSERT INTO SELECT语句 1.语法形式: Insert into Table2(field1,field2,…) select value1,value2,… from Table1 或 Insert into Table2 select * from Table1 2.限定条件: (1)Table2必须存在,并且字段field,field2…也必须存在: (2)如

mysql基础篇 - SELECT 语句详解

基础篇 - SELECT 语句详解 SELECT语句详解 一.实验简介 SQL 中最常用的 SELECT 语句,用来在表中选取数据,本节实验中将通过一系列的动手操作详细学习 SELECT 语句的用法. 二.实验准备 在正式开始本实验内容之前,需要先下载相关数据库表,搭建好一个名为mysql_shiyan 的数据库(有三张表:department,employee,project),并向其中插入数据. 具体操作如下,首先输入命令进入 /home/shiyanlou/Desktop 目录: cd /

浅谈case语句与select语句

case语句与select语句 case语句: 多分支if语句: if CONDITION1;then 分支1 elif CONDITION2;then 分支2 ... else CONDITION;then 分支n fi 例如下面这段代码,我们可以使用while语句内嵌套if语句实现, #!/bin/bash cat << EOF cpu) display cpu information mem) display memory information disk) display disks

浅谈Shell脚本中for循环、while循环及case分支语句

博文目录一.for循环语句二.使用while循环语句三.使用case分支语句 一.for循环语句 当面对各种列表重复任务时,使用简单的if语句已经难以满足要求,而顺序编写全部代码更是显得异常繁琐,困难重重.这将可以使用for循环语句很好的解决类似问题. 1.for语句的结构 使用for循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环.在这里,"取值列表"称为for语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通

shell编程之if语法、case语法、while语句、until语句、for语句、select语句

主要介绍shell基本语句的语法 if语句语法1 单分支结构 (如果,那么)if <条件测试> ;then 指令;fi 或者如下:if <条件测试>? then?  指令fi 2 双分支结构(如果,那么,否则...) if <条件表达式>? then ? 指令else ? 指令fi 多分支结构(如果,那么,否则如果,那么,否则...) if <条件表达式>? then ? 指令elif <条件表达式>? then?  指令else ? 指令fi其

sql的基础语句-select语句中出现的操作符号

2. select语句中出现的操作符号 2.1 合并操作符select a.ename||' '||to_char(sal) from emp a; 2.2 消除重复的行 select distinct deptno from emp; 2.3 空格.空串.null的区别 select ascii(' '),ascii(null),ascii('') from dual; 区别:  从显式上看,空串跟null在数据库中存储的值是一样的,但是NULL可以赋给任何数据类型,而空串只能赋给字符串类型