您的位置:首頁技術文章
文章詳情頁

Unix中利用列表作為循環

瀏覽:25日期:2024-06-10 13:24:21

在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為擴展名的文件?,F在系統工程師可能想一一統計這些文件的大小、創建日期、更新日期等等信息,然后將這些統計信息保存到一個文件中?;蛘呦雽@些文件進行改名,如在原先的名字之前加上一個backup的字符串,表示這些文件是備份文件。此時,如果一一對這些文件操作的話,會比較麻煩。那么比較合理的做法就是通過for循環來一次性完成這些任務。

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

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

標簽: Unix系統
国产综合久久一区二区三区