zoukankan      html  css  js  c++  java
  • bahs脚本条件判断和执行


    变量:
      局部变量
      本地变量
      环境变量

      特殊变量
      位置参数变量

    数据类型
      字符型
      数值型

    算数运算

      运算符 : =,-,*,/,%,**

      let VAR=算数运算
      expr $num1 op $num2
      $[算数运算]
      $((算数运算))

    增强型赋值
      变量做某种运算后存回至此变量中
      let i=$i+*
      let i+=*

      let的运算符
      += -+ *= /= %=
    自增
      VAR=$[$VAR+1]
      let VAR+=1
      let VAR++
    自减
      VAR=$[$VAR-1]
      let VAR-=1
      let VAR--

    条件测试
      判断某需求是否满足,需要由测试机制来实现

      如何编写测试表达式以实现所需求的测试

       1.执行命令,利用命令的返回值来判断
        echo $?
        0=ture
        1-255=false
       2测试表达式
        test 判断表达式
        [ 判断表达式 ]
        [[ 判断表达式 ]]

    注意 判断表达式 两端必须有空白字符,否则为语法错误

    bash的测试类型

      数值测试
      字符串测试
      文件测试


    数值判断表达式:数值比较

        -eq 是否等于 [ $num1 -eq $num2 ]
        -ne 是否不等于 [ $num1 -ne $num2 ]
        -gt 是否大于
        -ge 是否大于等于
        -lt 是否小于
        -le 是否小于等于

    字符判断表达式:字符串比较

        == 是否等于
        != 是否不等于
        > 是否大于
        < 是否小于
        =~ 左侧字符是否能被右侧的模式所匹配

        -z "STRING":判断指定的字符是否为空
        -n "STRING":判断指定的字符是否不空

    注意当引用变量做字符比较时 若其中一个变量值为空需要用双引号引起来
        如:
          ~]# echo $name

          ~]# [[ tom == $name ]]
          -bash: [: tom: 期待一元表达式 (判断表达式执行失败)
          ~] echo $?
          2 (返回值为2 执行失败)

          ~]# [[ tom == "$name" ]] (判断表达式执行成功)
          ~]# echo $?
          1 (返回值为1 字符不等于)

        注意:
        1:字符串比较最好加引号 变量加双引号 字符加单引号
        2:最好在使用[[]]双中括号进行比较

    文件测试
      存在性测试
          -e FILE 判断文件是否存在
          -a FILE 同上

      存在性及类型测试
          -b FILE 是否存在并且为块设备文件
          -c FILE 是否存在并且为字符设备文件
          -d FILE 是否存在并且为目录文件
          -f FILE 是否存在并且为普通文件
          -h FILE 是否存在并且为链接文件
          -P FILE 是否存在并且为管道文件
          -S FILE 是否存在并且为套接字文件

      文件权限测试
          -r FILE 是否存在并且对当前用户可读
          -w FILE 是否存在并且对当前用户可写
          -x FILE 是否存在并且对当前用户可执行

      特殊权限测试
          -u FILE 是否存在并且有suid权限
          -g FILE 是否存在并且有sgid权限
          -k FILE 是否存在并且有sticky权限

      文件是否有内容
          -s FILE 是否存在并且有内容

      时间戳测试
          -N FILE 文件自从上一次读取操作后是否被修改过

    访问时间戳 = Access = A TIME 只有访问文件才会更新
    更改时间戳 = Modify = M TIME 只有更改文件数据内容才会更新
    改动时间戳 = Change = C TIME 只要文件有改动就会更新(数据,元数据)


      从属关系测试
          -O FILE 是否存在并且当前用户是否为文件属主
          -G FILE 是否存在并且当前用户是否为文件属组
      双目测试
          FILE1 -ef FILE2 FILE1和FILE2是否指向同一个文件系统的相同inode
          FILE1 -nt FILE2 FILE1是否新于FILE2
          FILE1 -ot FILE2 FILE1是否旧于FILE2
          新于和旧于就是比较两个文件的MTIME时间戳 距离当前时间更近或更远

    组合条件测试


    第一张方式
        COMMAND1 && COMMAND2
        COMMAND1 || COMMAND2
        !COMMAND

        [-O FILE ] && [ -r FILE ]
    第二种方式
        COMMAND1 -a COMMAND2 同&&
        COMMAND1 -o COMMAND2 同||

        [ -O FILE -a -x FILE ]

    练习:将主机名保持至hostName变量中
    主机名如果为空 或 为 localhost.localdomain 则改为yangyang
        ~]# hostName=`cat /etc/hostname`

        ~]# [ -z "$hostName" -o "localhost.localdomain" == "$hostName" ] && hostname yangyang

    向脚本转递参数

    位置参数变量
        $1 = 位置参数变量中的第一个
        $2 = ...
        ${10} = 10以上需要加{}

    轮替
        shift [*] 位置参数轮替

    特殊变量
        $0 : 脚本文件路径本身
        $# : 脚本参数的个数
        $* : 所有参数 (每个参数当作一个独立的字符串)
        $@ : 所有参数 (所有参数当作一个完整的字符串)

    过程式编程语言的代码执行顺序
    顺序执行 :逐条执行

    选择执行
        单分支if语句
          if 测试条件;then
            代码分支
          fi

        双分支if语句
          if 条件测试;then
            代码分支
          else
            代码分支
          fi
    练习1 通过命令行参数给定一个用户名,判断ID号是偶数还是奇数
        #!/bin/bash
        id=`id -u $1`
        id2=`echo "$[ $id % 2 ]"`
        if [ $id2 -eq 0 ];then
        echo "$1 的uid是偶数"
        else
        echo "$1 的uid是奇数"
        fi
    练习2 通过命令行参数给定两个文本文件名,如果文件不存在,则结束脚本执行
    都存在时返回其中行数较多的文件并显示行数

    file1=`cat $1 2>/dev/null | wc -l`
    file2=`cat $2 2>/dev/null | wc -l`
     if [ -f $1 -a -f $2 ];then
       echo "$1 行数$file1"
       echo "$2 行数$file2"
          if [ $file1 -gt $file2 ];then
            echo "$1 行数较多"
          elif [ $file1 -eq $file2 ];then
            echo "$1 = $2"
          else
            echo "$2 行数较多"
          fi
    else
      for i in $1 $2;do
        ls $i &>/dev/null
          if [ $? -ne 0 ];then
            echo "指定的"$i"文件不存在"
          fi
      done
    exit 2
    fi


    循环执行

    循环方式有
      for 循环
      while 循环
      until 循环

              for循环

        for循环有两种格式
        1 遍历列表
        2 控制变量

          遍历列表    

            for i in in; do
            #statements
            done

          控制变量

            for (( i = 0; i < 10; i++ )); do
            #statements
            done

    进入条件 只要列表中有元素,即可进入循环
    退出条件 列表中的元素遍历完成,即退出循环

    list生成方式
      1 直接给出
      2 seq整数列表
      3 可返回列表的命令
      4 glob通配
      5 变量引用


    练习1 计算100内所有偶数之和 和 奇数之和
    #!/bin/bash
    #
    sum=0
    for i in `seq 0 2 100` ;do 将0改为1 即时奇数之和
    let sum=$sum+i
    done
    echo "$sum"


    练习2 计算所有用户id之和

    #!/bin/bash
    #
    sun=0
    uid=`cat /etc/passwd | awk -F ":" '{print $3}'`
    for i in $uid ;do
    let sum=$sum+$i
    done
    echo "$sum"

    练习3 计算某个目录下所有文本文件的行数之和;并说明有多少文本文件

    #!/bin/bash
    read -p "请输入一个目录" dir
    if [ -d "$dir" ];then
    sum=0
    file=`find $dir -type f | xargs ls`
    for i in $file ;do
    let sum=$sum+`cat $i | wc -l`

    done
    echo "目录下所有文本文件的行数总和$sum"
    echo "这个目录下共有`find $dir -type f | xargs ls | wc -l`个目录 "
    else
    echo "输入正确的目录"
    fi

              while循环 条件为真进入循环 条件为假退出

    while [[ condition ]]; do
    循环体
    循环控制变量修正表达式
    done

                until循环 和 while相反

    until [[ condition ]]; do
    循环体
    循环控制变量修正表达式
    done

    99乘法表
    #!/bin/bash
    #
    for a in {1..9};do
    for b in `seq 1 $a`;do
    echo -n ""$b"X"$a"=$[$a*$b] "
    done
    echo
    done


    bash脚本之用户交互
    通过标准输入,从而完成变量赋值操作
        read [OPTION]... [name]...
          常用选项
            -p 输出信息
            -t 定义超时时间

    脚本的状态返回值
    默认是脚本中执行的最后一条命令的状态返回值,如果前面所有命令都错了 单单最后一个成功了 脚本的返回值依然为0
    所以自己定义状态退出码
    exit [n] n为自己指定的状态码
    注意:shell进程遇到exit时,即会中止,因此整个脚本执行结束

  • 相关阅读:
    【leetcode】Binary Search Tree Iterator
    【leetcode】Palindrome Partitioning II
    【leetcode】Best Time to Buy and Sell Stock III
    【leetcode】Best Time to Buy and Sell Stock II
    【leetcode】Longest Consecutive Sequence
    【leetcode】Factorial Trailing Zeroes
    【leetcode】Simplify Path
    【leetcode】Generate Parentheses
    【leetcode】Combination Sum II
    【leetcode】Combination Sum
  • 原文地址:https://www.cnblogs.com/linuxys/p/13129396.html
Copyright © 2011-2022 走看看