首页 > 代码库 > 1.16字段分隔符和迭代器

1.16字段分隔符和迭代器

内部字段分隔符(Internal Field Separator,IFS)是shell脚本编程的一个重要概念。下面将讨论把单个数据流划分成不同数据元素的定界符(delimiter),内部字段分隔符是用于特定用途的定界符。IFS是存储定界符的环境变量。它是当前shell环境默认使用的默认定界字符串。

1、考虑一种情形,我们需要迭代一个字符串或逗号分隔型数值(Comma Separated Value,CSV)中的单词。如果是前一种,则使用IFS=".";如果是后一种,则使用IFS=","。如下

考虑CSV数据的情形:

data="http://www.mamicode.com/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

 

1.16字段分隔符和迭代器