内部字段分隔符(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
do
[ $count -eq 0 ] && user=$item;
[ $count -eq 6] && shell=$item;
let count++;
done;
IFS=$oldIFS
echo $user\‘s shell is $shell;
输出为
root‘s shell is /bin/bash
对一些列值进行迭代时,循环非常有用;
for 循环
for var in list;
do
commands;#使用变量$var
done
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 ]
do
let x++;
echo $x;
done