天天看點

1.16字段分隔符和疊代器

内部字段分隔符(Internal Field Separator,IFS)是shell腳本程式設計的一個重要概念。下面将讨論把單個資料流劃分成不同資料元素的定界符(delimiter),内部字段分隔符是用于特定用途的定界符。IFS是存儲定界符的環境變量。它是目前shell環境預設使用的預設定界字元串。

1、考慮一種情形,我們需要疊代一個字元串或逗号分隔型數值(Comma Separated Value,CSV)中的單詞。如果是前一種,則使用IFS=".";如果是後一種,則使用IFS=","。如下

考慮CSV資料的情形:

data="name,sex,rollno,location"

我們可以使用IFS讀取變量中的每一個條目。

oldIFS=$IFS

IFS=, #now IFS為,

for item in $data;

do

  echo Item: $item

done

IFS=$oldIFS

IFS的預設值為空白符(換行符、制表符或者空格)

2、在檔案/etc/passwd中,每一行包含了由冒号分隔的多個條目。檔案中的每行都對應一位使用者的相關屬性。

考慮這樣的輸入:root:x:0:0:root:/root:/bin/bash。每行的最後一項指定了使用者的預設shell。利用IFS列印出使用者以及他們對應的預設shell:

#!/bin/bash

#示範IFS的用法

line="root:x:0:0:root:/root:/bin/bash"

oldIFS=$IFS;

IFS=":";

count=0

for item in $line

 [ $count -eq 0 ] && user=$item;

 [ $count -eq 6] && shell=$item;

  let count++;

done;

echo $user\'s shell is $shell;

輸出為

root's shell is /bin/bash

對一些列值進行疊代時,循環非常有用;

for 循環

for var in list;

  commands;#使用變量$var

list 可以是一個字元串,也可以是一個序列。

echo {1..50}能夠生成一個從1~50的數字清單。同理echo {a..z}或{A..Z}或{a..h}可以生成子母表。

變量i在每次疊代的過程中都會儲存一個字元,範圍從a~z;

for i in {a..z};do actions;done;

for循環也可以采用C語言的for格式:

for(i=0;i<10;i++)

  commands;#使用變量$i

while循環

while condition

  do

  commands;

  done

用true作為循環條件能夠産生無限循環。

until循環

在bash中還可以使用一個特殊的循環until。它會一直執行循環,直到給定的條件為真。

x=0;

until [ $x -eq 9 ];#條件是[ $x -eq 9 ]

  let x++;

  echo $x;