shell学习笔记之七(循环)

循环
    shell中的循环主要有for,while,untile,select
    for
        1、列表for循环
            for VARIABLE in (list)
            do
                command
            done
            例:循环打印john喜欢的水果
                for fruit in apple orange banana pear
                do
                    echo  "$fruit is John‘s favorite"
                done
                echo "No more fruits."
            注意:
                in里面可以是任意命令的标准输出
                如:
                    fruits="apple orange banana pear"
                    seq 1 2 100     #产生1到100的奇数数列
                    ls
                    1..5    #表示1 2 3 4 5
                #!/bin/bash
                echo ‘变量作为in的参数‘
                fruits="apple orange pear"
                for fruit in ${fruits}
                do
                    echo $fruit
                done
                echo "序列作为in的参数"
                for var in 1 2 3 4 5
                do
                    echo $var
                done
                echo "seq产生的序列作为in的参数"
                #declare -i total=0
                total=0
                for var in $(seq 1 2 100)
                do
                    #total+=$var
                    #(( total += var ))     #注意算数运算的写法,一共三种写法都可以实现赋值
                    let "total+=var"
                done
                echo "1+3+5+...+99 is $total"
                echo "ls的结果作为in的参数"
                for var in $(ls)
                do
                    ls -l $var
                done
        2、不带列表的for循环
                for variable
                do
                    command
                done
                注意:使用不带列表的for,需要在运行脚本时通过参数的方式给for传递变量值
                #for.sh
                #!/bin/bash
                for var
                do
                    echo $var
                done
                # . ./for.sh 1 2 3
                可读性差,可以使用[email protected]实现上面的功能
                改进:
                    #!/bin/bash
                    for var in [email protected]
                    do
                        echo $var
                    done
        3、类Cfor循环
                for ((expression ;expression2; expression3))
                do
                    command
                done
                例:
                    #!/bin/bash
                    for (( i=0; i<10; i++ ))    #这里没有什么空格的要求,为了美观,使用空格
                    do
                        echo -n "$i "
                    done
        4、for的无限循环
                for((;1;))
                do
                    echo
                done
    while
        while expression
        do
            command
        done
        例:
            1、#输出1到10的数字序列
                #!/bin/bash
                declare -i count=0
                while [[ $count -lt 10 ]]
                do
                    echo "$count"
                    count+=1
                done
            2、#求1-100之和
            #求1-100之间奇数之和
                #!/bin/bash
                declare -i sum01=0
                declare -i sum02=0
                declare -i i=1
                declare -i j=1
                while [[ i -le 100 ]]
                do
                    sum01+=i;
                    j=i%2;
                    #if [[ $(( i%2 )) -ne 0 ]];then
                    if [[ j -ne 0 ]];then
                        sum02+=i;
                    fi
                    ((i++));#这里不可一写$((i++))
                done
                echo $sum01
                echo $sum02
            3、#猜数字
                #!/bin/bash
                num=8
                echo "Input a number in 1 to 10:"
                #体会read的用法
                while read guass
                do
                    if [[ $guass -eq $num ]];then
                        echo "Right."
                        break
                    else
                        echo "Wrong.Try Again"
                    fi
                done
            4、按行读取文件
                cat student_info.txt
                John    30  Boy
                Sue     28  Girl
                Wang    25  Boy
                Xu  23  Girl
                解法一:
                    #!/bin/bash
                    while read line
                    do
                        name=`echo $line | cut -d ‘ ‘ -f1` #echo输出line之后Tab会变成空格,所以使用cut的时候需要指定分割符(-d ‘ ‘)
                        age=`echo $line | cut -d ‘ ‘ -f2`  #也可以使用awk   awk ‘{print $n}‘,awk的分割符是空格(‘ ‘)或Tab
                        sex=`echo $line | cut -d ‘ ‘ -f3`
                        echo "My name is $name,I‘m $age years old,I‘m a $sex"
                    done < student_info.txt
                    注意:整个思路是清晰的,重点是怎么读取文件,选用什么命令处理行。比较而言,脚本比编辑一个高级语言程序要简洁很多
                解法二:
                    #!/bin/bash
                    cat student_info.txt | while read line
                    do
                        name=`echo $line | cut -d ‘ ‘ -f1`
                        age=`echo $line | cut -d ‘ ‘ -f2`
                        sex=`echo $line | cut -d ‘ ‘ -f3`
                        echo "My name is $name,I‘m $age years old,I‘m a $sex"
                    done
                两种解法功能相同,但是有细微差别。使用重定向的while只会产生一个shell,而使用管道的脚本在运行时会产生3个shell,第一个shell是cat(运行很快,导致无法使用ps命令抓到),第二个shell是管道,第三个shell是while
            5、无限循环
                #方法一
                while ((1))
                do
                    command
                done
                #方法二
                while true
                do
                    command
                done
                #方法三
                while :
                do
                    command
                done
                例:检测系统进程,
                    #!/bin/bash
                    while true
                    do
                        ATD_STATUS=`service atd status | grep running`
                        if [[ -z "$ATD_STATUS" ]];then
                            echo "ATD is stopped , try to restart."
                            service atd restart #在脚本中,如果不需要命令的返回值,则直接写命令即可,而不需要用$()命令替换
                        else
                            echo "ATD is running,wait 5 sec until next check"
                        fi
                        sleep 5 #延迟函数,单位是秒(s)
                    done
    until
        结构:
            until expression
            do
                command
            done
        描述:
            运行前测试,测试结果为false时继续执行,为true时退出
        例:
            #使用until计算1到100的和以及1-100的奇数和
            #!/bin/bash
            declare -i sum01=0
            declare -i sum02=0
            declare -i i=0
            until [[ i -gt 100 ]]
            do
                sum01+=i
                if [[ $[i%2] -ne 0 ]];then
                    sum02+=i
                fi
                ((i++));
            done
            echo "sum01=$sum01"
            echo "sum02=$sum02"

        until的无限循环
            until ((0))
            do
                command
            done
            until false
            do
                command
            done
    select循环
        结构:
            select Menu in (list)
            do
                command
            done
        描述:
            菜单扩展循环方式,语法和带列表的for循环非常类似
        例:
            1、判断用户的选择
                #!/bin/bash
                echo "Which car do you prefer?"
                select car in Benz Audi VolksWagen
                do
                    break   #注意这个break,没有这个会一直处于选择状态
                done
                echo "You chose $car"
                注解:select有判断用户输入的功能,所以select经常和case语句合并使用,
            2、联合使用select和case
                #!/bin/bash
                select var in Mon Tue Wed Thu Fri Sat Sun
                do
                    case $var in   #case是不需要break语句的
                        Mon)
                            echo "Today is Monday"
                            break ;;
                        Tue)
                            echo "Today is Tuesday"
                            break;;
                        Wed)
                            echo "Today is Wednesday"
                            break ;;
                        Thu)
                            echo "Today is Thursday"
                            break ;;
                        Fri)
                            echo "Today is Friday"
                            break ;;
                        Sat|Sun)
                            echo "You can have a rest day"
                            break;;
                        *)
                            echo "Unknown input.Try again" ;;
                    esac
                done
    嵌套循环
        例:打印九九乘法表
            #!/bin/bash
            declare -i i=1;
            declare -i j=1;
            declare -i k=0
            for (( i = 1; i <= 9; i++ ))
            do
                for (( j = 1; j <= i; j++ ))
                do
                    k=$i+$j
                    #let "k=i+j"
                    echo -ne $j"*"$i"="$k"\t"
                    #echo -ne $j"*"$i"="$(($i+$j))"\t"
                    #echo -ne $j"*"$i"="$[$j*$i]"\t"
                    #这里看到了多种表达式求值
                done
                echo
            done
            注意:
                1、for的类C写法,不需要$符号,也不需要使用-le之类的
                2、echo输出制表符,需要使用-e参数,这表示有转义字符时转义。没有-e会原样输出而不解释转义字符
                3、表达式求值
                4、自行改编成其他循环版本的九九乘法表
        扩展:使用sed和awk输出九九乘法表
            #!/bin/bash
            seq 9 |sed "H;g"|awk -v RS="" ‘{
                for(i=1;i<=NF;i++){
                    j=i*NR;
                    printf("%d*%d=%d\t",i,NR,i*NR);
                }
                printf("\n");
            }‘
    循环控制
        break
        continue
        不做详细介绍,跟高级语言一样,唯一的区别是break,continue后面可以接数字,表示跳出嵌套层数,和Java中的标签类似。
        例:打印素数
             解法一:
            #!/bin/bash
            declare -i i=1
            declare -i j=2
            for (( i = 1; i < 100 ; i++ ))
            do
                for (( j = 2; j < i ;j++ ))
                do
                    if ! (($i%$j));then    #注意! 和(())扩展运算之间有空格
                        break;
                    fi
                done
                if [[ $j -eq $i ]];then
                    echo -ne "$i\t"
                fi
            done
            echo
            解法二:
            #!/bin/bash
            declare -i i=1
            declare -i j=2
            for (( i = 1; i < 100 ; i++ ))
            do
                for (( j = 2; j < i ;j++ ))
                do
                    if ! (($i%$j));then   #注意! 和(())扩展运算之间有空格
                        continue 2; #continue后面的数字表示跳出的嵌套数
                    fi
                done
                if [[ $j -eq $i ]];then
                    echo -ne "$i\t"
                fi
            done
            echo
时间: 2024-10-13 05:32:43

shell学习笔记之七(循环)的相关文章

Accelerated C++学习笔记3—&lt;循环和计数&gt;

第2章 循环和计数 本节主要利用改进输出问候语的程序来改进如何支持循环和条件分支的. 1.使用循环输出一个周围带框架框住的问候语,且用户自己提供在框架与问候语之间的空格的个数. <span style="font-family:KaiTi_GB2312;">// lesson2_1.cpp : 定义控制台应用程序的入口点. //功能:使用循环 //时间:2014.5.8 #include "stdafx.h" #include "iostrea

Shell学习笔记——第三章

第三章 /etc/passwd 文件包含一个所有系统用户账户组成的列表,以及一些关于每个用户的基本信息. 例rich:x:501:Rich Blum:/home/rich:/bin/bash 每个条目都有7个数据字段,例使用冒号分隔.系统使用这些字段中的数据向用户分配具体的特性.这些字段分别有 用户名:用户密码(如果密码存储在其他文件中,则为占位符):用户的系统用户ID编号:用户的系统组的ID编号:用户的全名:用户默认的主目录:用户的默认Shell目录: cd 命令 略过 列表命令(ls) 参数

Citrix XenMobile学习笔记之七:XenMobile部署方式

XenMobile有3个版本,分别有不同的部署方式,既可以单独部署,也可以混合部署. XenMobile MDM版部署方式 部署方式一:在传统的DMZ区部署 部署方式二:在DMZ区后面部署(直通DMZ区) 部署方式三:负载均衡的MDM服务器部署 部署方式四:XNC的MDM部署 XenMobile App版部署方式 部署方式一:POC方式部署 部署方式二:和ShareFile集成部署 部署方式三:MDM和MAM集成部署 部署方式四:高可用部署 XenMobile Enterprise版部署方式 部

SHELL学习笔记----IF条件判断,判断条件

SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here       elif list then           do another thing here       else          do something else here fi  EX1: #!/bin/bash if [ `uname -m` == "x86_64" ]

Linux Shell 学习笔记

2.return与exit区别 return 表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调用. exit(0)表示正常退出执行程序,如果加其它的数值:1,2,....可以表示由于不同的错误原因而退出 . main函数中exit(0)等价于return 0. 1. Linux下一条命令或一个进程执行完成会返回一个一个状态码. 0 === 成功执行 非0 === 执行过程

Unity3D学习笔记之七创建自己的游戏场景

到现在为止我们已经拥有了比较完备的Prefab,已经可以创建宏大的游戏场景,并以第一人称视角在场景中漫游了.这里给大家做个小的示范,建一个小场景大家在创建场景的时候需要自由发挥,做个尽量大的场景出来. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 我们以最初的添加了First Person Controller的PFB_Straight为整个场景的中心点来展开.我们先从Project中Prefabs文件夹拖出来

2015 IOS 学习笔记 for循环 方法练习 ——蓝懿教育

今天学习了for循环以及方法,内容有些复杂,不过万变不离其宗 在以后的学习中容易掌握,因为涉及范围广阔,使用率高.所以多加练习后会掌握. ————————for循环—————————— for循环概念: for循环编程语言中的语句之一,用于循环执行.for循环是开界的,它的一般形式为: for(; <<span se-mark="1">条件表达式>; ) 语句: 初始化总是一个赋值语句, 它用来给循环控制变量赋初值: 条件表达式是一个关系表达式, 它决定什么时候

[Shell]Shell学习笔记之for

关于shell中的for循环用法很多,一直想总结一下,今天网上看到上一篇关于for循环用法的总结,感觉很全面,所以就转过来研究研究,嘿嘿…1. for((i=1;i<=10;i++));do echo $(expr $i \* 4);done2.在shell中常用的是 for i in $(seq 10)3.for i in `ls`4.for i in ${arr[@]}5.for i in $* ; do6.for File in /proc/sys/net/ipv4/conf/*/acce

Shell脚本学习笔记-循环结构

1. for循环语句 1.1. 语法格式: for var in list do commands done for ((表达式)) do commands done 1.2 简单示例: #!/bin/sh #从直接列表读取 echo "从直接列表读取" for var in 1 2 3 do echo "$var" done echo "\n" #从变量读取 echo "从变量读取" list="a b c&quo