一、for指令
在shell程式設計中,有時我們需要重複執行一直指令直至達到某個特定的條件,bash shell中,提供了for指令,允許你建立一個周遊一系列值的循環,每次疊代都通過一個該系列中的值執行一組預定義的指令。
for的基本格式:
for var in list
do
commands
done
在list中,你提供了疊代中要用的一系列值。在每個疊代中,變量var包含清單中的目前值,第一個疊代會适用清單中的第一個值,第二個疊代使用第二個值,以此類推,直至清單中的所有值都過一遍。
1.1讀取清單中的值
<code>[root@sh shell]</code><code># cat for1.sh</code>
<code>#!/bin/bash</code>
<code>for</code> <code>test</code> <code>in</code> <code>aaa bbb ccc ddd</code>
<code>do</code>
<code> </code><code>echo</code> <code>the next state is $</code><code>test</code>
<code>done</code>
<code>[root@sh shell]</code><code># sh for1.sh </code>
<code>the next state is aaa</code>
<code>the next state is bbb</code>
<code>the next state is ccc</code>
<code>the next state is ddd</code>
$test變量的值會在shell腳本的最後一次疊代中一直保持有效,除非你修改了它
<code>[root@sh shell]</code><code># cat for1.sh </code>
<code> </code><code>echo</code> <code>the next state is $</code><code>test</code>
<code>echo</code> <code>"the last state we visited was $test"</code>
<code>test</code><code>=fff</code>
<code>echo</code> <code>"wait. now we're visiting $test"</code>
<code>the last state we visited was ddd</code>
<code>wait. now we're visiting fff</code>
1.2讀取清單中的複雜值
在shell腳本中,優勢你會遇到難處理的數。下面是個給shell腳本程式員帶來麻煩的經典例子:
<code>[root@sh shell]</code><code># cat for2.sh </code>
<code>for</code> <code>test</code> <code>in</code> <code>I don</code><code>'t know if this'</code><code>ll work</code>
<code> </code><code>echo</code> <code>"word:$test"</code>
<code>[root@sh shell]</code><code># sh for2.sh </code>
<code>word:I</code>
<code>word:dont know </code><code>if</code> <code>thisll</code>
<code>word:work</code>
解決辦法:使用轉義符或者雙引号
<code>for</code> <code>test</code> <code>in</code> <code>I don\</code><code>'t know if "this'</code><code>ll" work</code>
<code>word:don't</code>
<code>word:know</code>
<code>word:</code><code>if</code>
<code>word:this'll</code>
記住:for循環假定每一個值都是用空格分割的,如果在單獨的數字值中有空格,那麼你必須使用雙引号來将這些值圈起來。
1.3從變量讀取清單
<code>[root@sh shell]</code><code># cat for3.sh </code>
<code>############################</code>
<code>list=</code><code>"aaa bbb ccc ddd eee"</code>
<code>list=$list</code><code>" Connecticut"</code>
<code>for</code> <code>state </code><code>in</code> <code>$list</code>
<code> </code><code>echo</code> <code>"Have you ever visited $state"</code>
<code>[root@sh shell]</code><code># sh for3.sh </code>
<code>Have you ever visited aaa</code>
<code>Have you ever visited bbb</code>
<code>Have you ever visited ccc</code>
<code>Have you ever visited ddd</code>
<code>Have you ever visited eee</code>
<code>Have you ever visited Connecticut</code>
1.4從指令讀取值
<code>[root@sh shell]</code><code># cat for4.sh </code>
<code>file</code><code>=</code><code>"/root/shell/states"</code> <code>#如果是在目前不用絕對路徑,file=“states”即可</code>
<code>for</code> <code>state </code><code>in</code> <code>`</code><code>cat</code> <code>$</code><code>file</code><code>`</code>
<code> </code><code>echo</code> <code>"Visit beautiful $state"</code>
<code>[root@sh shell]</code><code># sh for4.sh </code>
<code>Visit beautiful shanghai</code>
<code>Visit beautiful beijing</code>
<code>Visit beautiful hangzhou</code>
<code>Visit beautiful nanjing</code>
<code>Visit beautiful guangzhou</code>
<code>[root@sh shell]</code><code># cat states </code>
<code>shanghai</code>
<code>beijing</code>
<code>hangzhou</code>
<code>nanjing</code>
<code>guangzhou</code>
1.5更改字段分隔符
空格;
制表符:
換行符
如果bash shell在資料中看到了這些字元中任意一個,它就會假定你在清單中開始了一個新的資料段。
要解決這個問題,你可以在你shell腳本中臨時更改IFS環境變量的值來限制一下被bash shell當作字段分隔符的字元。但這種方式有點奇怪,比如,如果你行IFS的值使其隻能識别換行符,你必須這麼做:
IFS=$'\n'
将這個語句加入到腳本中,告訴bash shell在資料值中忽略空格和制表符。
<code>[root@sh shell]</code><code># cat for5.sh </code>
<code>file</code><code>=</code><code>"states"</code>
<code>IFS=$</code><code>'\n'</code>
<code>[root@sh shell]</code><code># sh for5.sh </code>
<code>Visit beautiful guang zhou</code>
<code>Visit beautiful nan ning</code>
<code>Visit beautiful jiang nan</code>
在處理長腳本中,可能在一個地方需要修改IFS的值,然後忘掉它在腳本中其他地方還原預設值。
例如:
IFS.OLD=$IFS
IFS=$'\n'
<use the new IFS value in code>
IFS=$IFS.OLD
其他的IFS值,如:在/etc/passwd中可能用到
IFS=:
也可以指派多個IFS:
IFS=$'\n:;"'
1.6用通配符讀取目錄
<code>[root@sh shell]</code><code># cat for6.sh </code>
<code>for</code> <code>file</code> <code>in</code> <code>/home/</code><code>*</code>
<code> </code><code>if</code> <code>[ -d </code><code>"$file"</code> <code>];</code><code>then</code>
<code> </code><code>echo</code> <code>"$file is a directory"</code>
<code> </code><code>elif</code> <code>[ -f </code><code>"$file"</code> <code>];</code><code>then</code>
<code> </code><code>echo</code> <code>"$file is a file"</code>
<code> </code><code>fi</code>
<code>[root@sh shell]</code><code># sh for6.sh </code>
<code>/home/apache-tomcat-8</code><code>.0.28.</code><code>tar</code><code>.gz is a </code><code>file</code>
<code>/home/dir1</code> <code>is a directory</code>
<code>/home/dir2</code> <code>is a directory</code>
<code>/home/fie1</code> <code>is a </code><code>file</code>
<code>/home/fie2</code> <code>is a </code><code>file</code>
<code>/home/fie22</code> <code>is a </code><code>file</code>
<code>[root@sh shell]</code><code># cat for7.sh </code>
<code>for</code> <code>file</code> <code>in</code> <code>/home/</code><code>* </code><code>/home/badtest</code>
<code> </code><code>else</code>
<code> </code><code>echo</code> <code>"$file doesn't exist"</code>
<code>[root@sh shell]</code><code># sh for7.sh </code>
<code>/home/badtest</code> <code>doesn't exist</code>
二、C語言風格的for指令
2.1 C語言風格的for指令
C語言的for指令有一個用來指明變量的特殊方法、一個必須保持成立才能繼續疊代的條件,以及另一個為每個疊代改變變量的方法。當指定的條件不成立時,for循環就會停止。條件等式通過标準的數字元号定義。
for (i=0; i<10; i++)
{
printf("The next number is %d\n",i):
}
第一部分将一個預設值賦給該變量,中間的部分定義了循環重複的條件,當定義的條件不成立時,for循環就停止疊代,最後一部分定義了疊代的過程。
bash中C語言風格的for循環的基本格式:
for (( variable assignment;condition;iteration process))
for (( a = 1; a < 10; a++ ))
本文轉自 HMLinux 51CTO部落格,原文連結:http://blog.51cto.com/7424593/1738811