内部字段分隔符(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;