Shell中的循環語句

在編程語言中,循環語句是最基本的語法之一,在Shell(這里是Bash)中也不例外。把相關內容整理一下吧。

這里包括for/while/until循環,以及變量自增的語法實例。

Shell(以Bash為例)中的循環語句一般有for、while、until這幾種,偶爾還有寫錯語法的時候,這里結合實例來自己總結一下。也為今后使用提供一個快捷的資料獲取渠道。

一、for循環語句

實例1.1 對目錄中的文件做for循環

#!/bin/bash
for x in
/var/log/*
do
        #echo "$x is a file living in /var/log"
       
echo $(basename $x) is a file living in
/var/log
done

注:這個$x獲得的是絕對路徑文件名;可以使用 “basename”
可執行程序來除去前面的路徑信息。如果只引用當前工作目錄中的文件(例如,如果輸入 “for x in
*”),則產生的文件列表將沒有路徑信息的前綴。
實例1.2 對位置參數做for循環

#!/bin/bash

for thing in
"$@"
do
        echo you typed ${thing}.
done

實例1.3 for循環中用seq產生循環次數,加上C語言形式的for循環語句

#!/bin/bash

echo "for: Traditional form:
for var in …"
for j in $(seq 1 5)
do
        echo
$j
done

echo "for: C language form: for (( exp1; exp2; exp3
))"

for (( i=1; i<=5; i++ ))
do
        echo "i=$i"

done

二、while循環語句

實例2.1 循環輸出1到10的數字

復制代碼 代碼如下:

#!/bin/bash
myvar=1
while [ $myvar
-le 10 ]
do
        echo $myvar
        myvar=$(( $myvar + 1
))
done

只要特定條件為真,”while” 語句就會執行

三、until循環語句

實例3.1 循環輸出1到10的數字
“Until” 語句提供了與
“while” 語句相反的功能:只要特定條件為假,它們就重復。下面是一個與前面的 “while” 循環具有同等功能的 “until” 循環。

復制代碼 代碼如下:

#!/bin/bash
myvar=1
until [ $myvar
-gt 10 ]
do
        echo $myvar
       myvar=$(( $myvar + 1
))
done

Linux
Shell中寫循環時,常常要用到變量的自增,現在總結一下整型變量自增的方法。
我所知道的,bash中,變量自增,目前有五種方法:
1.
i=`expr $i + 1`;
2. let i+=1;
3. ((i++));
4. i=$[$i+1];
5. i=$(( $i
+ 1 ))
可以實踐一下,簡單的實例如下:

#!/bin/bash
i=0;while [ $i -lt 4 
];do      echo $i;      i=`expr $i + 1`;      # let 
i+=1;      # ((i++));      # i=$[$i+1];      # i=$(( $i + 1 
))done

課后作業:

1.求100以內所有正整數之和

blob.png

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

結果:

#!/bin/bash
  ip=1
  up=0 down=0
 ipv4=10.1.252 
until [ $n -gt 255  ]
do
IP="$ipv4"."$n"
#for ipv in {0..255} ;do
 #  IP="$ipv4"."$ipv"
let n++
   ping "$IP" -c 1 -W 1 &>/dev/null && echo "The Up IPv4 is:$IP" && let up+=1 &>/dev/null || let down+=1 &>/dev/null
done
 echo "IPv4($ipv4.1-255) up is :$up"
 echo "IPv4($ipv4.1-255) down is :$down"

3.編寫腳本,打印九九乘法表

代碼:

#/bin/bash
i=1
j=1
until (($i>=10))
do
j=1
until (($j>$i))
do
sum=$[ $j*$i ]
echo -ne "$i*$j=$sum \t"
if [ $i == $j ] ;then
echo -en "\n"
      fi
     let j++
done
     let i++
done

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


#!/bin/bash
i=0
while (( i<10 ));do
    array[$i]=$((RANDOM%100))
  echo  -n "  ${array[$i]}"
 let i++
done
echo
max=${array[0]}
for j in `seq 1 9`;do
   if [ $max -lt ${array[$j]} ];then
     max=${array[$j]}
    else
   fi
done
echo $ma

x

5.編寫腳本,實現打印國際象棋棋盤

~                                                                                                                      

#!/bin/bash
let i=0
let j=0
for ((i=0; i < 8; i++));do
    echo -n $i
     for((j=0; j < 8; j++));do
        if [ $[$[$i+$j]%2]  -eq 0 ];then
                echo -en  "\033[43m  \033[0m"
         else
                echo  -en  "\033[42m  \033[0m"
           fi
      done
     echo  
done
echo -e " "  {A..H}
~

blob.png                                                                       

~                                                                                                                                                                                              

6.打印等腰三角形     

#!/bin/bash
 for i in `seq 1 2 10`;do
        k=1
       while [ $k -le $((10-$(($i+1))/2)) ];do
          echo -ne " " 
          let k++
        done
       for j in `seq 1 $i`;do
          echo -n "*"
       done
      echo  
 done
#!/bin/bash
i=1
while [ $i -le 10 ] ; do
     j=1
     while [ $j -le $((10-$i)) ] ; do
        echo -n ' '
        j=$(($j+1))
     done
     j=1
    while [ $j -le $((2*$i-1)) ] ; do
      echo -n x
      j=$(($j+1))
     done
    echo
    i=$(($i+1))

7.猜數字游戲


#!/bin/bash
s=0
I=3
while (( $s == 0 ));do
    var=$((RANDOM%11))
    echo "welcome! you will have three times to guess a number in range 0 to 10!" 
    while (( $I != 0 ));do
         read -p " please input you guess number:"  guess
         if  [ $guess-ge 0 ]  &> /dev/null;then
           if [ $guess -lt $var ];then
               echo "you guess number is too little, you have $[$I-1] time to try "
           elif [ $guess -gt $var ];then
                echo " you gues number is too large,  you have $[$I-1] time to try"
            elif [ $guess -eq $var ];then
                echo -e  "\033[32moh,great! you are win\033[0m"
                read -p "do you want to continue ?, anykey to continue ,n to quit :"  c
                if [ $c == n ];then
                   echo "you have quit game,goodbye!"
                   exit
                else
                   echo "you will comtinue , good luck to yoiu"
                   s=0
                   I=3
                 continue 3
               fi
           fi
        else
           echo " you input is wrong,please again"
           continue
        fi
      let I--
  done
  if [ $I==0 ];then
       echo -e  "\033[31moh,sorry,you lose!\033[0m"
  fi
   read -p "do you want to continue ?, anykey to continue ,n to quit :"  c
         if [ $c == n ];then
             echo "you have quit game,goodbye!"
              s=1
          else
               echo "you will comtinue , good luck to yoiu"
                s=0
                I=3
          fi
done

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

(0)
zsyzgwzsyzgw
上一篇 2016-08-22 09:29
下一篇 2016-08-22 09:29

相關推薦

  • Linux第三周

    一.正則表達式和擴展正則表達式 1.首先有各種工具來對文本進行的查看,分析,統計   cat 命令:查看文本的工具    cat主要有三大功能:1.一次顯示整個文件。$ cat filename2.從鍵盤創建一個文件。$ cat > filename     只能創建新文件,不能編輯已有文件.…

    2017-06-04
  • grep的用法(CentOS7)及有關正則表達式的使用

    http://www.cnblogs.com/wzhuo/p/6659352.html

    Linux干貨 2017-04-08
  • lvm邏輯卷管理

    #LVM 邏輯卷管理 一、創建pv        創建pv可以在物理硬盤(裸盤上創建),MBR類型的分區(要更改分區類型為linux lvm: 8e )。GPT分區也要更改分區類型為8e00 Linux LVM 。    還可以在RAID上創建。注意要在沒有數據的分區上…

    Linux干貨 2016-09-02
  • Linux基礎知識(三)

     本文的主要內容是:  1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。  2、取出最后登錄到當前系統的用戶的相關信息。  3、取出當前系統上被用戶當作其默認shell的最多的那個shell。  4、將/etc/passwd中的第三個字段數值最大的后10個用戶的信息全…

    Linux干貨 2016-10-03
  • 學習筆記–文本處理工具

    Linux下有很多文本處理工具,本文將介紹幾款比較常用的文本處理工具,比如對文本查看的工具:cat和less,文本截取工具:head和tail,按列抽取文本工具:cut,按關鍵字查詢文本工具:grep,下面將具體介紹各種工具的使用。 1、文本查看命令cat 用法: cat [OPTION]… [FILE]… cat命令一次性…

    Linux干貨 2016-08-07
  • 可伸縮的邏輯卷

    什么是邏輯卷? 邏輯卷簡稱LVM, LVM是Linux環境中對磁盤分區進行管理的一種機制,是建立在硬盤和分區之上、文件系統之下的一個邏輯層,可提高磁盤分區管理的靈活性.   為什么要使用邏輯卷? 邏輯卷相比于一般的磁盤分區, 具有更高的靈活性。可隨時伸縮空間的大小.   構建邏輯分區圖:   邏輯卷概念: PV(物理卷): 是在…

    Linux干貨 2016-09-01
欧美性久久久久