bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


bash下的很多命令都会分割单词,绝大多数时候默认是采用空格作为分隔符,有些时候遇到制表符、换行符也会进行分隔。最典型的是"for i in a b c",它会分割变量列表"a b c"使其成为三个变量。这种分隔符是由IFS变量指定的。

IFS是bash内部字段分隔符的环境变量。

[root@xuexi ~]# set | grep IFS
IFS=$' \t\n'

默认的IFS在碰到空格、制表符\t和分行符\n就会自动分隔进入下一步。但是对空格处理有点不一样,对行首和行尾两边的空格不处理,并且多个连续的空格默认当作一个空格。

有些时候在编写脚本或执行循环的时候,修改IFS可以起很大作用。如果要修改IFS,最好记得先备份系统IFS,再需要的地方再还原IFS。

例如:

[root@xuexi ~]# data="name,sex,rollno,location"

[root@xuexi ~]# oldIFS=$IFS  # 备份IFS到变量oldIFS

[root@xuexi ~]# IFS=$','   # 将IFS设置为逗号,便于做data的分隔符

[root@xuexi ~]# for item in $data;do echo Item:$item;done
Item:name
Item:sex
Item:rollno
Item:location
[root@xuexi ~]# IFS=$oldIFS  # 最后将IFS还原

可以看到,上面的示例将默认分隔符设置为了逗号后,不用处理data变量就可以轻松划分字段了。

再来一个有趣的示例:逐字符打印各个字符。

cat /etc/resolv.conf | (IFS=$'\034';while read -N  x;do /usr/bin/printf "%s" "$x";sleep 0.1; done)

上面的while read -N 1 x表示每次读取一个字符并保存到变量x中,因为可能读取到空格或换行符,使得printf输出时无法输出,所以修改了IFS的值,将其设置为"\034",这是一个控制字符,不可能出现在文件中,所以对文件中任何一个字符都很安全。

大多数时候,我们都不会去修改IFS也不会想到通过修改IFS来达到某种目的,而是采用其他方法来替代实现。这样就需要注意默认IFS(" \t\n")的一个特殊性,它会忽略前导空白和后缀空白,并压缩连续空白。在某些时候,这会出现意想不到的问题。

例如:

[root@xuexi ~]# a=-s" "
[root@xuexi ~]# echo "$a" | wc -m

实际上这里的$a是3个字符组成的,最后一个字符为空格。如果不对变量加引号,那么很多情况下都会出现问题:

[root@xuexi ~]# echo $a | wc -m           # s后面的空格被忽略了

[root@xuexi ~]# echo "${a:2}" | wc -m  # 截取到了s后面的空格

[root@xuexi ~]# echo ${a:} | wc -m    # 没有截取到s后面的空格

[root@xuexi ~]# expr substr $a   | wc -m     # 没有截取到s后面的空格

[root@xuexi ~]# expr substr "$a"   | wc -m  # 截取到了s后面的空格

因此,在可以对变量加引号的情况下,尽100个可能地加上引号来保护空白字符。

IFS简单说明的更多相关文章

  1. IFS解惑

    一.IFS 介绍 Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符.完整定义是The shell uses the value stored in ...

  2. Shell中的IFS

    一.IFS 介绍 Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符.完整定义是The shell uses the value stored in ...

  3. Linux和Shell回炉复习系列文章总目录

    本页内容都是本人回炉Linux时整理出来的.这些文章中,绝大多数命令类内容都是翻译.整理man或info文档总结出来的,所以相对都比较完整. 本人的写作方式.风格也可能会让朋友一看就恶心到直接右上角叉 ...

  4. 关于 Word Splitting 和 IFS 的三个细节

    在 Bash manual 里叫 Word Splitting,在 Posix 规范里叫 Field Splitting,这两者指的是同一个东西,我把它翻译成“分词”,下面我就说三点很多人都忽略掉(或 ...

  5. Highcharts图形报表的简单使用

    Highcharts是一个纯JavaScript框架,与MSChart完全不一样,可以在网页中使用,所以php.asp.net.jsp等等页面中都可以使用.Highcharts官网:http://ww ...

  6. iOS 实现简单的Http 服务

    http 是计算机之间通讯协议的比较简单的一种.在iPhone上,由于没有同步数据和文件共享,所以实现PC与设备之间的数据传输的最佳方式就是在程序中嵌套一个http 服务器.在这篇帖子中,我将简单的演 ...

  7. 【转】shell中IFS用法

    http://blog.itpub.net/27181165/viewspace-775820/ 一 IFS的介绍   Shell 脚本中有个变量叫IFS(Internal Field Seprato ...

  8. Shell中IFS用法

    一 .IFS的介绍    Shell 脚本中有个变量叫IFS(Internal Field Seprator) ,内部域分隔符.完整定义是The shell uses the value stored ...

  9. 转 shell中字分隔的妙用:变量IFS

    IFS 的全称是 Interal Field Separator  ,即"内部区域分隔符",它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space  c ...

随机推荐

  1. JavaScript基础视频教程总结(131-140章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. Android缩放动画[ScaleAnimation]

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s ...

  3. 基于面向方面和UML的实时系统建模研究

    一.基本信息 标题:基于面向方面和UML的实时系统建模研究 时间:2010 出版源:计算机技术与发展 领域分类:面向方向:实时系统:横切关注点:统一建模语言: 二.研究背景 问题定义:实时系统建模研究 ...

  4. OC内存管理、非ARC机制、MRR机制

    在Xcode里面,默认为ARC(auto reference counting),也就是自动内存管理机制,在这里我们要了解的是内存管理,肯定是不能让系统帮我们管理内存,我们需要将ARC关闭,首先在左边 ...

  5. 转 SaaS应用十大关键NFR - 第1部分

    非功能需求(SaaS的NFR)是跨越应用功能的跨越所有模块和功能的要求.这些要求深入到应用程序的架构,这是他们得到解决的地方.因此,在SaaS架构阶段之前了解这些NFR对于特定应用程序很重要,因此应用 ...

  6. Drools为什么没有规则流Flow Flie

    哪个大神能告诉我,我安装的是Drools7.7.0,为什么没有网上说的flow file啊?怎么才能出来规则流呢? 上图是我本地的显示,下图是网上的图片.

  7. qrcode.php

    <!doctype html><html><head> <meta charset="UTF-8"/> <meta name= ...

  8. c#图像处理入门(-bitmap类和图像像素值获取方法)

    c#图像处理入门 -bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义 ...

  9. 【洛谷4172】 [WC2006]水管局长(LCT)

    传送门 洛谷 BZOJ Solution 如果不需要动态的话,那就是一个裸的最小生成树上的最大边权对吧. 现在动态了的话,把这个过程反着来,就是加边对吧. 现在问题变成了怎么动态维护加边的最小生成树, ...

  10. [Postman]证书(13)

    Postman的本机应用程序提供了一种基于每个域查看和设置SSL证书的方法. 要管理客户端证书,请单击标题工具栏右侧的扳手图标,选择“设置”,然后选择“ 证书”选项卡. 添加客户端证书 要添加新客户端 ...