歡迎您光臨本站 註冊首頁

Unix中利用列表作為循環

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

在Unix操作系統中開發應用程序,循環語句可以說佔了半壁江山.由於Unix操作系統中採用的是shell編程環境,為此循環機制在結構上不同於其他的高級語言,如循環語句之一的for循環,就存在很大的差異.筆者就跟大家介紹一下,在Unix操作系統中如何使用for循環以及相關的注意事項,幫助大家提高對這個for循環的利用程度.

  一、for循環的基本結構.

  在shell環境中,for循環主要有兩部分組成,分別為循環列表於操作語句.具體格式如下:

  for variable in list (循環列表)

  do

  commands (操作語句)

  done

  從上面這個結構中可以看出,在for循環中使用變數和列表來定義循環列表.另外,在利用do與done關鍵字將要執行的操作括起來.其中變數的作用就是依次從循環列表中取值,並將這個參數值傳遞給操作語句,進行相關的操作.其實,在學習這個for循環中,操作語句部分並沒有多少的難度,或者說沒有新鮮的內容.這裡就是一些unix操作系統的基本語句所構成的.而其難點就是在於循環列表的確定.這個循環列表關係到for循環運行的兩個關鍵參數,一是循環的次數,二是循環內部操作所需要用到的參數值.為此筆者在介紹這個for循環時,重點也是放在這個循環列表的設置上.也就是說,系統工程師只要精通這個循環列表的編寫,那麼其他內容不會有問題.

  二、如何編製循環列表?

  由於shell是一個跟Unix操作系統友好集成的編程環境,或者說是操作系統中的一個部分.為此這個循環列表的定義方式要比高級語言的for循環豐富的多.如可以使用很多操作系統的文件或者參數來作為其循環條件.具體來說,系統工程師可以按照如下的規則來設置這個循環列表.

  1、 利用文件來作為循環列表.

  有時候可能列表比較大,如總共有100多個條目.雖然可以依次將這些條目寫在for語句的循環列表中,但是會大大的增加代碼的長度,從而影響其閱讀.以後若要更改這些條目的話,還需要去更改這個源代碼.顯然這會很麻煩.如現在系統工程師需要查找在用戶目錄下,是否有用戶想要的20個文件.這20個文件名字沒有什麼規律.正常情況下,用戶需要一一輸入文件名.文件名輸入一個,然後查詢一次.一共做二十次,顯然這操作起來的工作量會非常的大.如果這個文件的數目再增加的話,那麼操作起來就會更加的麻煩.在for循環中可以解決這個問題.即只需要在循環列表中將這20個文件名字輸入進去,然後再操作語句中通過查詢操作在指定目錄中查找看是否有相關的文件.若有的話,將位置等信息保存到一個文件中.這就可以簡化用戶的操作,只需要進行一個for循環即可.同時還可以大幅度的縮短查詢的時間.

  但是,此時遇到的一個問題就是要在for循環的循環列表中輸入20個文件名字.為此系統工程師希望能夠將這些文件的名字保存在文件中,然後讓for循環從文件中讀取這些內容.這即方便,也利於後續的調整.其實在for循環中,是支持從文件中讀取相關的列表信息.不過這需要用到一個cat命令.大家都知道,這個cat命令的用途主要是從一個文件中讀取相關的信息.如果用過管道符的系統工程師,一定知道,可以將某個命令的結果作為另外一個命令的參數.其實,在這裡用到的也是這個原理,只是不需要通過管道符來實現而已.具體來說,這個循環列表可以如下定義.For name in 『cat filename.txt』(注意,由於其讀取后變為了文本的內容,為此需要加上單引號).當for循環的列表很大,沒有規律可循的話,雖然可以直接在循環列表中一一列出列表項,但這不是筆者所推薦的方法.筆者認為,遇到這種情況時,最好能夠向上面筆者建議的,將列表項保存在一個文件中.然後在for循環的循環列表中利用cat命令進行讀取.由於此時這個文件跟程序是相對獨立的,為此以後若需要調整這個列表項的值,不需要修改源代碼即可以實現.為此者也被認為是一種靈活性比較高的處理方式.如果列表項需要經常調整,那麼即使列表項的內容不是很多,也可以通過這種方法來提高其靈活性.

  2、 利用系統變數作為循環列表.

  在Unix操作系統中,for循環最大的特色,莫過於可以利用系統變數來作為循環列表.如還是以查詢操作為例,用戶可能需要從指定的幾個文件夾中查找某個文件.而這幾個目錄都是有環境變數所確定的.如一個系統工程師剛到企業,接替老的系統工程師的工作.此時這位系統工程師就需要知道Unix伺服器系統的一些基本配置.而這其中有一項重要的內容就是一些重要環境變數的設置.如安裝了Oracle資料庫,就需要知道其安裝路徑.若安裝了Mail伺服器,則需要知道其郵件的存儲位置與備份位置等等.如果一一去查看這些環境變數,工作量會比較大.如果換成是筆者的話,不會做這麼沒有效率的事情.筆者的做法是,編寫一個for循環,然後將這些重要的環境變數輸出到一個文件中進行備份.這將為筆者後續的工作帶來很大的方便.如現在筆者想知道Oracle的安裝目錄與mail的環境變數,就可以利用下面這個循環列表來實現.

  For varhome in $ORACLE_HOME $MAIL.


在這個for循環中,筆者採用了系統的環境變數作為其循環語句.當系統工程師利用系統環境變數來作為循環列表時,需要注意以下幾個事項.,這個列表項必須全部大寫.也就是說,系統變數必須大寫這個規則也適用於這個for循環.其次,再變數名之前必須加入$這個環境變數的符號,否則的話,編譯器會無法識別.三是在多個環境變數之間,不需要加入分隔符.

  3、 利用通配符作為循環列表.

  有時候可能系統管理員有這個要求.在某個文件下有多以txt為擴展名的文件.現在系統工程師可能想一一統計這些文件的大小、創建日期、更新日期等等信息,然後將這些統計信息保存到一個文件中.或者想對這些文件進行改名,如在原先的名字之前加上一個backup的字元串,表示這些文件是備份文件.此時,如果一一對這些文件操作的話,會比較麻煩.那麼比較合理的做法就是通過for循環來一次性完成這些任務.

  此時,如何書寫這個循環列表呢?筆者認為比較合理、比較簡便的方法就是通過通配符來實現.如可以利用如下語句來實現:for filename in *.txt.利用這個循環列表,系統就會從目錄中查找所有以.txt為擴展名的文件,然後將其為參數,進行後續的操作.如用戶需要進行文件更名的話,則可以使用sed操作來對文件進行重命名.在使用通配符作為循環列表中的參數時,最好採用合適的通配符.通配符*或者%其含義不盡相同.如果系統工程師能夠了解他們其中的差異,並在這裡對症下藥,選擇合適的通配符.那麼就可以起到事半功倍的效果.

  在for循環中除了使用上面三種特殊的循環列表外,系統工程師往往還可能採用位置參數作為循環列表.如可以將命令行中的參數賦值給位置參數,來實現一些比較複雜的功能.由於篇幅限制,筆者在這裡不對這個位置參數做詳細的解釋了.如有有需要的話,筆者在以後的文章中會談到這個問題.


[火星人 ] Unix中利用列表作為循環已經有367次圍觀

http://coctec.com/docs/linux/show-post-53387.html