1.16 字段分隔符和迭代器

《Linux Shell 脚本攻略(第 2 版)》读书笔记

字段分隔符

内部字段分隔符(Internal Field Seprator,IFS),是当前shell环境使用的默认定界字符串。对于 IFS 的定义如下:

The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read builtin command. The default value is .

IFS 的作用如下:

  • IFS作为Shell的内置变量,是一个用于分割字段的字符列表。
  • Shell把变量IFS内的每一个字符都当做是一个分割符(delimeter),用这些字符作为每一个字段的结束符来进行分割。
  • 如果IFS没有设置,或者IFS的值被设置为“ \t\n”(space, tab和 newline),那么操作对象的开始和结束处的所有space, tab和newline序列都将被忽略,但是操作对象中间的space, tab和newline序列会作为界定符工作。
  • 如果IFS值不是默认值(例如程序中对IFS进行设置过),只有出现在IFS内的空白字符(可能是space, tab或newline中的一个或几个)才会在单词开始和结束处被忽略,这里说的是单词,而不是整个操作对象。
  • IFS内的非空白字符多个连续出现时,每个非空白字符会被当做单独的分隔符看待,但是多个连续的空白字符会被当做一个分隔符看待。
  • 如果IFS为空(“null”),则不会进行单词分割。

以上几点参考了网上的这篇文章《详细解析Shell中的IFS变量》

查看 IFS 的默认值

$ echo -n "$IFS" | hexdump
0000000 20 09 0a    #0x20, 0x09和0x0a分别对应于空格(space), 水平制表符(tab)和换行符(newline)的值
0000003 

演示 IFS 的用法

#!/bin/bash

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…in

for var in list; do #list可以是一个字符串,也可以是一个序列(如:{a..z})
    #循环体
done

C 风格 for 循环

for((i=0;i<10;i++)) {
    #循环体
}

while 循环

while condition; do #condition为真,则进入循环;否则退出
    #循环体
done

until 循环

x=0;
until [ $x -eq 9 ]; do #x的值等于9时退出循环
    let x++; echo $x;
done

你可能感兴趣的:(1.16 字段分隔符和迭代器)