美文网首页
(2)shell脚本编程进阶之运算和循环语句

(2)shell脚本编程进阶之运算和循环语句

作者: 王王王小白 | 来源:发表于2017-07-06 15:14 被阅读0次

    (一)算术运算

    (1)bash 中的算术运算:

    help let +, -, *, /, % 取模(取余), ** (乘方)

    (2)实现算术运算:

    • (1) let var= 算术表达式
    • (2) var=$[ 算术表达式]
    • (3) var=$(( 算术表达式))
    • (4) var=$(expr arg1 arg2 arg3 ...)
    • (5) declare –i var = 数值
    • (6) echo ‘ 算术表达式’ | bc
    • (7) 乘法符号有的场景需要转义*

    (3)增强型赋值:+=, -=, *=, /=, %=

    let var OPER value
    

    例如:

    let count+=3自加3后自赋值
    自增,自减:
    let var+=1
    let var++
    let var-=1
    let var--
    

    (二)语句流程控制

    (1)条件选择if(if语句可以进行嵌套)

    • 单分支
      if 判断条件;then
      条件为真的分支代码
      fi
    • 双分支
      if 判断条件; then
      条件为真的分支代码
      else
      条件为假的分支代码
      fi
    • 多分支
      if 判断条件 1 ; then
      条件为真的分支代码
      elif 判断条件 2 ; then
      条件为真的分支代码
      elif 判断条件 3 ; then
      条件为真的分支代码
      else
      以上条件都为假的分支代码
      fi

    Ps:

        根据命令的退出状态来执行命令
        if ping -c1 -W2 station1 &> /dev/null; then
                        echo 'Station1 is UP'
                elif grep "station1" ~/maintenance.txt &> /dev/null
                        then
                        echo 'Station1 is undergoing maintenance‘
                else
                        echo 'Station1 is unexpectedly DOWN!'
                exit 1
        fi
    

    (2)case语句

    条件判断和函数结合可以Linux系统脚本经常出现

        case 变量引用 in
        PAT1)
                分支1
                ;;
        PAT2)
                分支2
                ;;
        ...
        *)
                默认分支
                ;;
        esac
    

    (三)循环语句

    (1)for循环

         for  变量名 in  列表;do
                循环体
        done
    

    现在详细解释下for循环中的列表,又该如何去控制列表中的元素。
    列表生成方式:

    • (1) 直接给出 列表
    • (2) 整数列表:
    • (a) {start..end}
    • (b)$(seq [start [step]] end)
    • (3) 返回列表的 命令
    • $(COMMAND)
    • (4) 使用glob如:*.sh
    • (5) 变量引用;$@, $*

    for循环的特殊格式

        for (( 控制变量初始化; 条件判断表达式; 控制变量的修正表达式))
        do
                循环体
        done
    
    • 控制变量初始化:仅在运行到循环代码段时执行一次
    • 控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
      #/bin/bash
      read -p "please enter MD5 encrypts the random number " num
      for j in seq 0 32767;
      do
      k=echo "$j" |md5sum|cut -c1-10
      if [[ $num == $k ]];then
      echo "$j"
      exit
      fi
      done
      (2)while 循环
      while CONDITION; do
      循环体
      done
    • CONDITION :循环控制条件;进入循环之前,先做一次判
      断;每一次循环之后会再次做判断;条件为“true” ,则执行
      一次循环;直到条件测试状态为“false”终止循环
    • 因此:CONDTION 一般应该有循环控制变量;而此变量的值
      会在循环体不断地被修正
    • 进入条件:CONDITION 为true
    • 退出条件:CONDITION 为false

    while 循环的特殊用法(遍历文件的每一行):依次读取/PATH/FROM/SOMEFILE 文件中的每一行,且将行赋值给变量line

        while read line; do
                循环体
        done < /PATH/FRO/SOMEFILE
        Ps:打印国际象棋的棋盘函数用while实现嵌套if函数
        #/bin/bash
        red(){ echo -e '\033[41m        \033[0m';}
        yellow(){ echo -e '\033[43m        \033[0m';}
        a=1
        while [ $a -le 10 ]
        do
        b=1
        while [ $b -le 10 ]
        do
                let c=$a+$b
                if [ `expr $c % 2` = "0" ]
                then
                        echo -en `red``red``red`
                else
                        echo -en `yellow``yellow``yellow`
                fi
                let b++
        done
                let a++
                echo
        done
    

    (3)until循环
    until CONDITION; do
    循环体
    done
    进入条件: CONDITION 为false
    退出条件: CONDITION 为true
    这里需要注意的是until和while的用法正好相反,while是条件判断为真时,继续执行循环,但是until却是条件判断为假的时候却是继续执行循环。所以,这样就给我们了很好的选择,但是在正常的生产构成中却是while和for语句用的稍微多一点。
    #!/bin/bash
    #step through all the positional parameters
    until [ -z "$1" ]
    do
    echo "$1"
    shift
    done
    echo
    (4)循环控制语句continue
    continue [N] :提前结束第N 层的本轮循环,而直接进入下一
    轮判断;最内层为第1层
    while CONDTIITON1; do
    CMD1
    ...
    if CONDITION2; then
    continue [N] #[N]的意思是我需要跳出几次循环默认为1是当前循环
    fi
    CMDn
    ...
    done
    (5)循环控制shift 命令

    • shift [n]用于将参量列表 list 左移指定次数,缺省为左移一次。
    • 参量列表 list 一旦被移动,最左端的那个参数就从列表中删
      除。while 到 循环遍历位置参量列表时,常用到 shift
      while [ $# -gt 0 ] # or (( $# > 0 ))
      do
      echo $*
      shift
      done
      (6)无限循环(while、until)
      while true; do
      循环体
      done
      until false; do
      循环体
      done
      (8)select 循环与菜单
      select variable in list
      do
      循环体命令
      done
    • select 循环主要用于创建菜单,按数字顺序排列的示菜单项将显示在标准错误上,并显示 PS3 提示符,等待用户输入
    • 用户输入菜单列表中的某个数字,执行相应的命令
    • 用户输入被保存在内置变量 REPLY 中
    • select 用 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 按 命令终止脚本。也可以按 ctrl+c退出循环
    • select 和经常和 case 联合使用
    • 与 for 略循环类似,可以省略 in list,此时使用位置参量

    相关文章

      网友评论

          本文标题:(2)shell脚本编程进阶之运算和循环语句

          本文链接:https://www.haomeiwen.com/subject/drzchxtx.html