腳本編程之循環:for,while,until

shell中的循環語句一般有:

for   while   until

一、for

    for 變量名 in 列表;do

        循環體

    done

    

    首先將in后list列表的第一個常數或字符串賦值給循環變量,

    然后執行循環體;依次賦值列表中的字段,最后執行done命令后的命令序列。

    list列表生成方式: 

        (1) 直接給出列表    1 2 3

        (2) 整數列表:

            (a) {start..end}     {1..10}

            (b) $(seq [start [step]] end)    `seq 1 10`

        (3) 返回列表的命令 $(COMMAND) 

        (4) 使用glob,如:*.sh

        (5) 變量引用; $@, $*

提示輸入正整數n的值,計算1+2+3+…n的 總和

read -p "please enter a positive integer:" n
    for i in $(seq 1 $n 2>/dev/null);do
        let s+=i
    done
done
echo "sum=$s"

   特殊用法:類似C語言for

    for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式)) 

    do

        循環體

    done 

    雙小括號:實現C風格變量操作 ((i++)) 

    控制變臉初始化:僅在第一次循環時執行

    控制變量的修正表達式:會在進入下一輪循環前先執行

1到100正整數和for實現

for((i=1;i<=100;i++));do
    let sum+=i
done
echo $sum

二、while

    while CONDITION; do

        循環體

    done 

        條件為真,執行循環;

        條件為假,退出循環。

     直到不符合條件則退出循環

    CONDITION:循環控制條件;進入循環之前,先做一次判斷;每次循環后再次判斷;

    CONDTION變量的值應為變化的;應該在循環體不斷地被修正;創造退出循環的條件

1到100內所有正整數和while實現

i=1
while [ $i -le 100 ];do
    let s=s+i
    let i++
done
echo "$s"

  特殊用法:

    while read line; do

        循環體

    done < /PATH/FROM/SOMEFILE

    依次讀取文件中的每一行復制給變量line

掃描/etc/passwd文件每一行,如發現GECOS字段為空,則填 充用戶名和單位電話為62985600,

并提示該用戶的GECOS信 息修改成功。

while read line ;do
    user=`echo $line|cut -d: -f1`
    gc=`echo $line|cut -d: -f5`
    [ -z $gc ]&>/dev/null && usermod -c "$user 62985600" $user && printf "%-12s %s\n" $user
 "GECOS changed"
done < /etc/passwd
echo finished

三、until

    until CONDITION; do

        循環體

    done

        條件為假,執行循環

        條件為真,退出循環

    直到符合條件退出循環

1到100正整數和until實現

i=0
until [ $i -gt 100 ];do
let sum+=i
let i++
done
echo $sum

循環控制語句:

    一般結合判斷語句使用,用于跳過某些指定情況

    1)continue #    #為第幾層,最內層為1層 

        提前結束第#層的本輪循環,直接進入#層下一輪判斷。

    2)break #    結束#層循環,最內層為1層 

        直接結束#層循環體,#層后續的循環不再執行。

作業:

1、每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶hacker登錄,則將登錄時間和主機記錄于日志/var/log/login.log中,并提示該用戶退出系統。

#!/bin/bash
#
echo
until w|cut -d ' ' -f1|grep "hacker" ;do
    let i++
    echo -e "\b\r$i \t `date` \t no hacker"
    sleep 3
done
echo "should logout"|mail -s 'warning' hacker
echo "is here ! ! !"
echo -e "`date` warning! `w|grep "^hacker"`">>/var/log/messages

2、隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出

#!/bin/bash
#
n=$[RANDOM%11]
num=a
until [ $num -eq $n ]&>/dev/null;do
    read -p "please enter a numbe [0-10]:" num
    if [ -z $num ] ;then
        continue 2
    elif [[ ! $num =~ 1?[0-9] ]] ;then
        continue 2
    elif [ $num -gt $n ] ;then
        echo "    your number is bigger"
    elif [ $num -lt $n ] ;then
        echo "    your number is smaller!"
    fi
done
echo you hit the number!  $n

3、編寫腳本,求100以內所有正整數之和

#!/bin/bash
#zjj
i=0
until [ $i -gt 100 ];do
    let sum+=i
    let i++
done
echo $sum

4、編寫腳本,通過ping命令探測172.16.250.1-254范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。

#!/bin/bash
#
i=1
NumUp=0
NumDown=0
echo
until [ $i -gt 254 ];do
    if ping -W1 -c1 10.1.252.$i &>/dev/null ;then
        let NumUp++
        echo -e "\n\t\t 10.1.252.$i  is up  $NumUp"
    else
        let NumDown++
        echo -e "\b\r$NumDown down"
    fi
    let i++
done

5、編寫腳本,打印九九乘法表

#!/bin/bash
#
i=1
until [ $i -gt 9 ];do
    j=1
    until [ $j -gt $i ];do
        echo -n -e  "${j}*${i}=$[$i*$j]\t"
        let j++
    done
echo
let i++
done

6、編寫腳本,利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者

#!/bin/bash
#zjj
i=1
ran=$RANDOM
max=$ran
min=$ran
echo $ran
until [ $i -gt 9 ];do
    ran=$RANDOM
    echo $ran
    if [ $ran -gt $max ];then
        max=$ran
    elif [ $ran -lt $min ];then
        min=$ran
    fi
    let i++
done
echo MAX=$max   MIN=$min

7、編寫腳本,實現打印國際象棋棋盤

#!/bin/bash
#
i=1
row=1
until [ $row -gt 8 ] ;do
column=1
    until [ $column -gt 8 ] ;do
        i=$[$i%2]
        if [ $i -eq 1 ];then
            echo -ne "\033[47m  \033[0m"
        else
            echo -ne "\033[41m  \033[0m"
        fi
        let i++
        let column++
    done
echo
    let row++
    let i++
done

8、打印等腰三角形 (菱形)

#!/bin/bash
#
read -p "enter the number of line:" line
for((i=1;i<=$line;i++))
do
    count=$[2*$i-1]
    sapce=$[$line-$i+1]
    printf "%${sapce}c" ' '
    for((j=1;j<=$count;j++));do
        echo -n "*" 
    done
echo
done
for((i=$[line-1];i>=1;i--))
do
    count=$[2*$i-1]
    sapce=$[$line-$i+1]
    printf "%${sapce}c" ' '
    for((j=1;j<=$count;j++));do
        echo -n "*" 
    done
echo
done

9.安裝centos6.7,用centos6.8kernel升級

原創文章,作者:Jasper,如若轉載,請注明出處:http://www.www58058.com/36913

(0)
JasperJasper
上一篇 2016-08-18 10:10
下一篇 2016-08-18 10:10

相關推薦

  • redis基礎配置

    主程序:redis-server 配置文件:/etc/redis.conf 目錄: 1.redis-cli命令 2.conf配置文件 3.主從復制原理與架構實現 4.redis的高可用方案 – sentinel 2.conf配置文件 #### GENERAL #### daemonize yes #以守護進程的方式運行 pidfile “/var…

    Linux干貨 2017-08-08
  • 推薦-Centos常用的進程管理和資源查看工具

    一、pstree     pstree命令以樹狀圖的方式展現進程之間的派生關系 -a:顯示每個程序的完整指令,包含路徑,參數或是常駐服務的標示;  -c:不使用精簡標示法;  -G:使用VT100終端機的列繪圖字符;  -h:列出樹狀圖時,特別標明現在執行的程序;  -H<…

    Linux干貨 2016-04-05
  • 到處都是Unix的胎記

    一說起Unix編程,不必多說,最著名的系統調用就是fork,pipe,exec,kill或是socket了(fork(2),execve(2), pipe(2), socketpair(2), select(2), kill(2), sigaction(2))這些系統調用都像是Unix編程的胎記或簽名一樣,表…

    Linux干貨 2015-04-03
  • 基于heartbeat v2 crm實現基于nfs的mysql高可用集群

    前言 因heartbeat v1內置的資源管理器haresource功能比較簡單,且不支持圖形化管理,所以heartbeat v2不再支持haresource,轉而使用更加強大的資源管理器crm進行集群管理。本文將講解如何基于heartbeat v2 crm實現基于nfs的mysql高可用集群。 高可用實現 實驗拓撲 實驗環境 node1:172.16.10…

    Linux干貨 2015-06-11
  • shell四劍客之sed

    概述 Stream EDitor, 行編輯器 sed是一種流編輯器,它一次處理一行內容。處理時,把 當前處理的行存儲在臨時緩沖區中,稱為“模式空間”( pattern space),接著用sed命令處理緩沖區中的內容 ,處理完成后,把緩沖區的內容送往屏幕。接著處理下一 行,這樣不斷重復,直到文件末尾。文件內容并沒有改變 ,除非你使用重定向存儲輸出。Sed主要…

    Linux干貨 2016-08-15
  • N26_第二周

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 a 文件查看類  cat tac  head  tail more  less b 文件操作類  touch cp  mv  rm more命令:   &nbsp…

    2017-05-26
欧美性久久久久