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

(一)算术运算

(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脚本编程进阶之运算和循环语句)