(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,此时使用位置参量
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容