shell 編程 (三)-for 循環,while循環,break,continue,exit

[toc]

一、for循環

重複執行一系列命令在 編程中很常見。通常你需要重複一組命令直到達到某個特定條件,比如處理某個目錄下的所有文件、系統上的所有用戶或者是某個文本文件中的所有行。

常見的兩種循環,在腳本中普遍被用到。

for循環
while循環

語法:for 變量名 in 條件; do …; done

for var in list
do
  commands
done

在list參數中,提供了迭代中要用的一系列值

示例1:用for循環來寫個1-100的求和。

思路:

  • [ ] 首先需要把1-100循環
  • [ ] 循環一次相加一次,並賦值給sum
  • [ ] 輸出sum的值
  • seq 這個就是遍歷1-100這些數字。
[root@xavi ~]# !vim
vim sum01.sh

#!/bin/bash
sum=0
for i in `seq 1 100`
do
   sum=$[ $sum+$i ]
   echo $i
done
echo $sum

示例2: 遍歷一個目錄的目錄或者文件

#!/bin/bash
cd /etc/            //腳本中如果查詢的目錄在多級目錄下,首先要進入到目錄,或者,直接跟絕對路徑
for a in `ls /etc/`     //遍歷/etc目錄
do
    if [ -d $a ]        //一個一個的去判斷是否爲目錄
    then
    ls -d $a    //如果是目錄,就查看下目錄內的文件+子目錄
    fi
done
[root@xavi ~]# !vim
vim for02.sh

#!/bin/bash
cd /etc/
for a in `ls /etc/`
do
   [ -d $a ] && ls $a
 # 判斷是否是目錄,並列出其下文件和子目錄
   if [ -d $a ]
   then
       echo $a
       ls $a
   fi
done
~             

特殊for循環示例:list循環時,會以空格或回車符作爲分隔符了

[root@xavi ~]# mkdir xavi
[root@xavi ~]# cd xavi/
[root@xavi xavi]# ls
[root@xavi xavi]# touch 1 2
[root@xavi xavi]# touch 3\ 4.txt
[root@xavi xavi]# ls
1  2  3 4.txt
[root@xavi xavi]# for i in `ls ./`; do echo $i ; done
1
2
3
4.txt //把3 4.txt一個文件拆分成兩個了

二、while循環

語法:

while test command
do
  other commands
  done

案例1:寫個腳本去監控系統的負載

#!/bin/bash
while :         //:爲死循環的意思,也相當於ture,
do
    load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`
if [ $load -gt 10 ]
then
    top|mail -s "load is high: $load" [email protected]
fi
sleep 30
// 負載有時候不可能一秒鐘就起來了,所以每隔30秒判斷一次即可。我們使用sleep 去暫停30秒鐘。然後再次執行。。。
done

案例2: 通過和用戶的交互得到一個值,並判斷。

把用戶輸入的數字輸出.

  • [ ] 首先判斷,如果用戶沒有輸入怎麼辦?
  • [ ] 用戶輸入的不是純數字怎麼辦?
  • [ ] 根據用戶輸入的數字,並輸出。
#!/bin/bash
while :
do
    read -p "Please input a number: " n
    if [ -z "$n" ]
    then
        echo "you need input sth."
        continue
    fi
    n1=`echo $n|sed 's/[0-9]//g'`
    if [ -n "$n1" ]  // -n = ! -z ,記得加雙引號
    then
        echo "you just only input numbers."
        continue
    fi
    break
done
echo $n
  • [ ] continue: 當用戶沒有輸入的時候,首先提示,然後繼續讓用戶輸入。直到輸入是一個真正的數字,跳出if語句。

  • [ ] break:如果是一個真正的數字,則跳出整個while語句。

三、break的用法

示例:

#! /bin/bash

for i in `seq 1 5`
do 
    echo $i
if [ $i == 3 ]
then
    break
fi
echo $i
done
echo aaa

執行步驟如下:

[root@xavi xavi]# sh -x break.sh
++ seq 1 5
+ for i in '`seq 1 5`'
+ echo 1
1
+ '[' 1 == 3 ']'
+ echo 1
1
+ for i in '`seq 1 5`'
+ echo 2
2
+ '[' 2 == 3 ']'
+ echo 2
2
+ for i in '`seq 1 5`'
+ echo 3
3
+ '[' 3 == 3 ']'
+ break
+ echo aaaa
aaaa

也就是說,一旦遇到break就會跳出當前循環,進行下一步。

四、continue 的用法:

忽略continue之下的代碼,直接進行下一次循環。

#! /bin/bash

for i in `seq 1 5`
do 
    echo $i
if [ $i == 3 ]
then
    continue
fi
echo $i
done
echo aaa

執行結果如下:

1
1
2
2
3
4
4
5
5
aaa

也就是說,當執行到continue的時候,下面任何語句直接忽略。。直接進行了下一次for循環。

五、exit 退出整個腳本

#! /bin/bash

for i in `seq 1 5`
do 
    echo $i
if [ $i == 3 ]
then
    exit
fi
echo $i
done
echo aaa

執行步驟如下:

++ seq 1 5
+ for i in '`seq 1 5`'
+ echo 1
1
+ '[' 1 == 3 ']'
+ echo 1
1
+ for i in '`seq 1 5`'
+ echo 2
2
+ '[' 2 == 3 ']'
+ echo 2
2
+ for i in '`seq 1 5`'
+ echo 3
3
+ '[' 3 == 3 ']'
+ exit
  • [ ] 當直行到3的時候,直接就退出腳本 。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章