天天看點

腳本入門之for循環

面向過程的編譯語句,語言控制結構:

順序執行:預設法則,逐條執行各語句

選擇執行:條件判斷,隻有部分是符合條件,隻執行符合條件的部分

布爾測試:真,假(0:真;1-255:假);

循環執行:将同一段代碼反複執行n次;循環必須要有退出條件,否則就成為了死循環。

控制語句:

     bash循環控制語句:

              for

              while

              until

bash的for循環:

      事先提供一個元素清單,而後,使用變量去周遊此元素清單;每通路一個元素,就會執行一次循環體;直到元素周遊完畢

用法格式:

        for VAR_NAME in 元素(清單)1 元素(清單)2…

        do

語句1

語句2

           …

        done

注:for和do可以寫在同一行中但必須用分号隔開

對于這些知識的運用隻能在練習中不斷練習才能達到牢固掌握。

練習1:寫一個腳本

      使用for循環建立目錄/tmp/1.dir,/tmp/2.dir和/tmp/3.dir,并将它們的權限均修改為750;

#!/bin/bash

for DirName in/tmp/1.dir /tmp/2.dir /tmp/3.dir; do

 mkdir $DirName

 chmod 750 $DirName

done

ls –l /tmp 驗證一下

練習2:寫一個腳本

使用for循環修改目錄/tmp/1.dir,/tmp/2.dir和/tmp/3.dir的最近一次修改時間為2010年3月3号3點3分3秒;

for Dir in/tmp/1.dir /tmp/2.dir /tmp/3.dir

do

touch -mt201003030303.03 $Dir

stat/tmp/1.dir 檢視結果

或:#!/bin/bash

stat $Dir

練習3:寫一個腳本

使用for循環統計/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab檔案中各自以#開頭的行的行數;

        #!/bin/bash

for File in/etc/fstab /etc/rc.d/rc.sysinit /etc/inittab

grep '^#.*' $ File| wc -l

人性化寫法:

for File in/etc/fstab /etc/rc.d/rc.sysinit /etc/inittab ; do

    LINES=`grep '^#' $File | wc -l`

    echo "$File:$LINES"

for File in/etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do

    LINES=$(grep '^#' $File | wc -l)

練習4:寫一個腳本

使用for循環統計/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab檔案中各自以#開頭的行的行數和空白行數;

for File in/etc/fstab /etc/rc.d/rc.sysinit /etc/inittab;do

 echo "$File:"

 echo "lines:`grep "^#" $File |wc -l`"

 echo "space lines:`grep "^$"$File | wc -l`"

練習5:寫一個腳本

使用for循環,複制/etc/fstab、/etc/inittab和/etc/rc.d/init.d/functions檔案至/tmp/目錄中,并重命名為原有的名稱之後加目前日期,如第一個檔案為/tmp/fstab-2013-07-15;

for File in/etc/fstab /etc/inittab /etc/rc.d/init.d/functions; do

 cp $File /tmp/$File-`date +%F`

練習6:寫一個腳本

     顯示/etc/passwd檔案中第1、3、6、12個使用者的使用者名、ID和shell;

#! /bin/bash

for Line in 1 3 6 12;do

UserName=`head -$Line /etc/passwd | tail -1 | cut -d: -f1`

        Uid=`head-$Line /etc/passwd | tail -1 | cut -d: -f3`

        Shell=`head-$Line /etc/passwd | tail -1 | cut -d: -f7`

        echo"User: $UserName, UID is $Uid, Shell: $shell"

練習7:寫一個腳本

     顯示/etc/passwd檔案中第1、3、6、12個使用者的使用者名、ID和基本組的組名;

for Line in 1 3 6 12; do

Uid=`head -$Line /etc/passwd | tail -1 | cut -d: -f3`

GroupName=`id -gn $UserName`

echo "$UserName, $Uid, $GroupName"

清單的生成方式:

1:逐個給出,如:/etc/inittab/etc/fstab;

2:使用通配符來實作檔案通配,例:for File in /var/*;

3:使用指令生成清單,詳見下例(生成的一般為相對路徑)

            #!/bin/bash

for File in `ls /var`;do

                  file /var/$file

4:生成數字序列;

    {}:{起始數字..結束數字},例如{1..100}表示從1到100之間的所有正整數

      `seq [起始數字] [步長] [結束數字]`,例:seq 1 2100 表示從1到100之間以2個機關輸出

練習8: 寫一個腳本

使用for循環取出每個使用者使用者名和Shell;

LINES=`wc -l/etc/passwd | cut -d' ' -f1`

for I in `seq 1$LINES`; do

 head -$I /etc/passwd | tail -1 | cut -d:-f1,7