iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
0
自我挑戰組

30 天不間斷-資工隨筆大雜燴系列 第 24

[Day 24] 自己的 Shell Script 自己寫 - for 迴圈

  • 分享至 

  • xImage
  •  

前言

接下來我們將以兩個概念依序介紹迴圈

正文開始~

迭代

迭代的概念就是一列排隊排好的物件,從第一個開始依序裝箱存到變數裏面,做一些處理之後,箱子回到下一個物件的前面,第二個物件再跳進去箱子,做一些處理,依照這樣的順序直到最後一個物件也執行完之後,這整個迴圈才結束。

語法

迭代這個概念適合用 for 語法來實作,有了概念之後先來看一下語法吧。

for..in

for 變數 in 物件1 物件2 物件3
do 
    程式碼
done

因此回想剛剛提到的迭代概念,物件1 跳進目前的變數,執行程式碼到 done 之後,變數回到一開始的 for,然後內容改裝物件2,直到物件3也結束之後整個迴圈才算完成。

例如我們想要從 1 印到 10,我們可以這樣寫:

for i in {1..10}
do
    echo "$i"
done

其中 {1..10} 相當於

1 2 3 4 5 6 7 8 9 10

也可以這樣寫

$(seq 1 10)

或是用下面介紹的語法來完成

for..do..done

for ((初始值;判斷式;步數間隔))
do
    程式碼
done
  • 初始值:變數初始化,例如 i=0。
  • 判斷式:當這個判斷式回傳 True 的時候,就會執行下面的區塊。
  • 步數間隔:如果是 i=i+2,則代表每跑完一次迴圈之後 i 會加 2,帶入下一次的迴圈中使用。

那回想剛剛的例子,從 1 印到 10 我們該怎麼做呢?

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

代表 i 的初始值是 1,當 i 小於或等於 10的時候,就執行 echo "$i",每執行完一次 i 就加 1,直到 i > 10的時候才跳到 done,結束這個迴圈。

因此上述的三種寫法得到的結果呈現如下:

 $ ./one_to_ten.sh                                                          
1
2
3
4
5
6
7
8
9
10

寫腳本囉

PATH 環境變數中存着很多腳本執行檔的路徑,因此我們寫一個腳本判斷底下的檔案是否可以執行,並作數量統計。

  1 #!/bin/bash
  2 
  3 IFS=":" #把PATH變數 路徑1:路徑2:路徑3 拆成 路徑1 路徑2 路徑3,方便等一下的變數能夠迭代
  4 count=0 #記錄可執行檔的個數
  5 non_count=0 #記錄不可執行檔的個數
  6 
  7 for directory in $PATH
  8 do
  9   if [ -d "$directory" ]  # 判斷是否是路徑
 10   then
 11     for command in "$directory"/* # 尋訪路徑下的所有檔案
 12     do
 13       if [ -x "$command" ] # 判斷檔案是否可執行
 14       then
 15         count=$(( $count + 1 ))
 16       else
 17         echo "[注意!] 偵測到不可執行的命令: $command"      
 18         non_count=$(( $non_count + 1 ))
 19       fi
 20     done
 21   fi
 22 done
 23 
 24 echo "總共有 $count 個可執行命令, $non_count 個不可執行命令"

上一篇
[Day 23] 自己的 Shell Script 自己寫 - 判斷式(2)
下一篇
[Day 25] 自己的 Shell Script 自己寫 - While 迴圈
系列文
30 天不間斷-資工隨筆大雜燴30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言