多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 服務器 > shell學習筆記之七(循環)

shell學習筆記之七(循環)

來源:程序員人生   發布時間:2015-06-04 07:54:37 閱讀次數:3502次
循環
    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 ))     #注意算數運算的寫法,1共3種寫法都可以實現賦值
                    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
                可讀性差,可使用$@實現上面的功能
                改進:
                    #!/bin/bash
                    for var in $@
                    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⑴00之和
            #求1⑴00之間奇數之和
                #!/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++));#這里不可1寫$((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
                解法1:
                    #!/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
                    注意:全部思路是清晰的,重點是怎樣讀取文件,選用甚么命令處理行。比較而言,腳本比編輯1個高級語言程序要簡潔很多
                解法2:
                    #!/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只會產生1個shell,而使用管道的腳本在運行時會產生3個shell,第1個shell是cat(運行很快,致使沒法使用ps命令抓到),第2個shell是管道,第3個shell是while
            5、無窮循環
                #方法1
                while ((1))
                do
                    command
                done
                #方法2
                while true
                do
                    command
                done
                #方法3
                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⑴00的奇數和
            #!/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,沒有這個會1直處于選擇狀態
                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
    嵌套循環
        例:打印99乘法表
            #!/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"	"
                    #echo -ne $j"*"$i"="$(($i+$j))"	"
                    #echo -ne $j"*"$i"="$[$j*$i]"	"
                    #這里看到了多種表達式求值
                done
                echo 
            done
            注意:
                1、for的類C寫法,不需要$符號,也不需要使用-le之類的
                2、echo輸出制表符,需要使用-e參數,這表示有轉義字符時轉義。沒有-e會原樣輸出而不解釋轉義字符
                3、表達式求值
                4、自行改編成其他循環版本的99乘法表
        擴大:使用sed和awk輸出99乘法表
            #!/bin/bash
            seq 9 |sed "H;g"|awk -v RS="" '{
                for(i=1;i<=NF;i++){
                    j=i*NR;
                    printf("%d*%d=%d	",i,NR,i*NR);
                }
                printf("
");
            }'
    循環控制
        break
        continue    
        不做詳細介紹,跟高級語言1樣,唯1的區分是break,continue后面可以接數字,表示跳出嵌套層數,和Java中的標簽類似。
        例:打印素數
             解法1:
            #!/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	"
                fi
            done
            echo
            解法2: 
            #!/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	"
                fi
            done
            echo 
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 午夜老司机在线观看 | xxxxx古代性xxxx| 国产在线喷潮免费观看 | 日本在线视频一区 | 国产亚洲精品久久久久久久网站 | 国产亚洲精品一区二区久久 | 欧美曰韩一区二区三区 | 国产精品亚洲综合第一区 | 欧美办公室系列激情videos | 国产亚洲欧洲精品 | 欧美jizz18欧美 | 亚洲久久在线观看 | 日本欧美一区二区三区在线 | 一级毛片一级毛片一级毛片aa | 欧美成人网在线综合视频 | 精品国产亚洲人成在线 | 欧美一级在线观看播放 | 正在播放国产精品放孕妇 | 伊人性视频 | 国产高清一区二区三区视频 | 手机在线看片国产 | 国产毛片一级国语版 | 久久精品国产主播一区二区 | 欧美激情站 | 亚洲一区二区三区四区视频 | 国产成人综合久久精品红 | 欧美午夜性视频 | 亚洲韩国日本欧美一区二区三区 | 99久久999久久久综合精品涩 | 国产精品久久久久免费 | 成人a毛片高清视频 | 1000部禁止18观看视频在线看 | 国产精品视频流白浆免费视频 | 亚洲品质自拍视频网站 | 欧美成人h版影院在线播放 欧美成人h版在线观看 | 日本不卡一区二区三区视频 | 亚洲视频欧美 | 亚洲影视先锋 | 亚洲视频在线不卡 | 亚洲视频区 | 精品久久久视频 |