zl程序教程

您现在的位置是:首页 >  Java

当前栏目

shell脚本-循环选择语句

2023-02-18 16:37:50 时间

过程式编程语言: 顺序执行 选择执行 循环执行 注:条件中的变量,可以在执行语句中使用,不用在加上"$"。

if语句

    根据命令的退出状态来执行命令
    单分支
        if  判断条件;then
            条件为真的分支代码
        fi
    双分支
        if  判断条件; then
            条件为真的分支代码
        else
            条件为假的分支代码
        fi
    多分支
        if  判断条件 1 ; then
            条件为真的分支代码
        elif  判断条件 2 ; then
            条件为真的分支代码
        elif  判断条件 3 ; then
            条件为真的分支代码
        else
            以上条件都为假的分支代码
        fi
        逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if 语句

大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…   

通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。 [ -f "somefile" ] :判断是否是一个文件 [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限 [ -n "a" = "a和b是否相等          -r file     用户可读为真   -w file     用户可写为真   -x file     用户可执行为真   -f file     文件为正规文件为真   -d file     文件为目录为真   -c file     文件为字符特殊文件为真   -b file     文件为块特殊文件为真   -s file     文件大小非0时为真   -t file     当文件描述符(默认为1)指定的设备为终端时为真 ######################################################### 含条件选择的shell脚本     对于不含变量的任务简单shell脚本一般能胜任。但在执行一些决策任务时,就需要包含if/then的条件判断了。shell脚本编程支持此类运算,包括比较运算、判断文件是否存在等。基本的if条件命令选项有: - eq —比较两个参数是否相等(例如,if [ 2 –eq 5 ]) -ne —比较两个参数是否不相等 -lt —参数1是否小于参数2 -le —参数1是否小于等于参数2 -gt —参数1是否大于参数2 -ge —参数1是否大于等于参数2 -f — 检查某文件是否存在(例如,if [ -f "filename" ]) -d — 检查目录是否存在 几乎所有的判断都可以用这些比较运算符实现。脚本中常用-f命令选项在执行某一文件之前检查它是否存在。

case 语句

    case用法:
        case 变量引用 in
        PAT1)
            分支1
            ;;
        PAT2)
            分支2
            ;;
            ...
        *)
            默认分支
            ;;
        esac
    case 支持glob 风格的通配符:
        *:  任意长度任意字符
        ?:  任意单个字符
        []:指定范围内的任意单个字符
        a|b: a 或b

for语句

    for  变量名 in 列表;do
        循环体
    done
        依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体;  直到列表中的元素耗尽,循环结束。
    or
    for ((exp1;exp2;exp3)); do
        COMMANDS
    done
        控制变量初始化:仅在运行到循环代码段时执行一次
        控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
    列表生成方式:
        直接给出列表
        整数列表:
            (a) {start..end}
            (b) $(seq [start [step]] end)==`        `
        返回列表的命令
            $(COMMAND)
        使用glob,如:*.sh
        变量引用;
            $@, $*

while语句

    while CONDITION; do
        循环体
    done
    CONDITION:
        循环控制条件,进入循环之前,先做一次判断,每一次循环之后会再次做判断。
        条件为"true" ,则执行一次循环,直到条件测试状态为"false" 终止循环。
        CONDTION 一般应该有循环控制变量,而此变量的值会在循环体不断地被修正。
    进入条件:
        CONDITION 为true
    退出条件:
        CONDITION 为false
    特殊用法
        遍历文件的每一行
        while read line(任意); do
            循环体
        done < /PATH/FROM/SOMEFILE
        or
        命令、文件或其他(标准输出) |while read line; do
            循环体
        done 
        依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

until语句

    until CONDITION; do
        循环体
    done
    CONDITION:
        循环控制条件,进入循环之前,先做一次判断,每一次循环之后会再次做判断。
        条件为"false" ,则执行一次循环,直到条件测试状态为"true" 终止循环。
        CONDTION 一般应该有循环控制变量,而此变量的值会在循环体不断地被修正。
    进入条件: 
        CONDITION  为false
    退出条件: 
        CONDITION  为true

控制语句

    continue
        用于循环体中,直接继续下个循环。
        continue [N],提前结束第N层的本轮循环,而直接进入下一轮判断,最内层为第1层。
    break
        用于循环体中,退出整个循环。
        break [N],提前结束第N层循环,最内层为第1层。
    shift
        用于将参量列表list左移指定次数,缺省为左移一次。
        shift [n],移动N个位置,参量列表list 一旦被移动,最左端的那个参数就从列表中删除。
        while 到循环遍历位置参量列表时,常用到 shift。
            $1=a,  $2=b,  $c=d
            shift
            $1=b,  $2=d
            shift
            $1=d
    wait
        用于等待命令执行结束,并exit 退出

select语句

    select 变量名 in LIST ; do
        循环体命令
    done
    select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示 PS3 提示符,等待用户输入。
    用户输入菜单列表中的某个数字,执行相应的命令。
    用户输入被保存在内置变量 REPLY中。
        PS3="INPUT:"
        select menu in bai hei hong lv;do
            echo $menu
        done
    select与case的对比
        select 是个无限循环,因此要记住用 break令退出循环,或用 exit命令终止脚本,也可以按 ctrl+c退出循环。
        select 经常和 case 联合使用
        与for循环类似,可以省略in LIST,此时使用位置参量。

trap信号捕捉

    trap ' 触发指令'  信号
        自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作。
    trap ' '  信号
        忽略信号的操作
    trap '-'  信号
        恢复原信号的操作
    trap -p
        列出自定义信号操作
    trap 示例
        #!/bin/bash
        trap 'echo “signal:SIGINT"' int
        trap -p
        for((i=0;i<=10;i++))
        do
                sleep 1
                echo $i
        done
        trap '' int
        trap -p
        for((i=11;i<=20;i++))
        do
                sleep 1
                echo $i
        done
        trap '-' int
        trap -p
        for((i=21;i<=30;i++))
        do
                sleep 1
                echo $i
        done