IFS简单说明
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简单说明的更多相关文章
- IFS解惑
一.IFS 介绍 Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符.完整定义是The shell uses the value stored in ...
- Shell中的IFS
一.IFS 介绍 Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符.完整定义是The shell uses the value stored in ...
- Linux和Shell回炉复习系列文章总目录
本页内容都是本人回炉Linux时整理出来的.这些文章中,绝大多数命令类内容都是翻译.整理man或info文档总结出来的,所以相对都比较完整. 本人的写作方式.风格也可能会让朋友一看就恶心到直接右上角叉 ...
- 关于 Word Splitting 和 IFS 的三个细节
在 Bash manual 里叫 Word Splitting,在 Posix 规范里叫 Field Splitting,这两者指的是同一个东西,我把它翻译成“分词”,下面我就说三点很多人都忽略掉(或 ...
- Highcharts图形报表的简单使用
Highcharts是一个纯JavaScript框架,与MSChart完全不一样,可以在网页中使用,所以php.asp.net.jsp等等页面中都可以使用.Highcharts官网:http://ww ...
- iOS 实现简单的Http 服务
http 是计算机之间通讯协议的比较简单的一种.在iPhone上,由于没有同步数据和文件共享,所以实现PC与设备之间的数据传输的最佳方式就是在程序中嵌套一个http 服务器.在这篇帖子中,我将简单的演 ...
- 【转】shell中IFS用法
http://blog.itpub.net/27181165/viewspace-775820/ 一 IFS的介绍 Shell 脚本中有个变量叫IFS(Internal Field Seprato ...
- Shell中IFS用法
一 .IFS的介绍 Shell 脚本中有个变量叫IFS(Internal Field Seprator) ,内部域分隔符.完整定义是The shell uses the value stored ...
- 转 shell中字分隔的妙用:变量IFS
IFS 的全称是 Interal Field Separator ,即"内部区域分隔符",它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space c ...
随机推荐
- deepCopy深拷贝
function deepCopy(p,c){ var c = c || {}; for ( var i in p ){ //确保属于自己的属性 if ( p.hasOwnProperty( i ) ...
- window.open()新开网页被拦截
问题:同一个项目,同一个浏览器,不同模块,相同的代码(同是window.open()),为何一个直接打开,另一个直接被拦截? 原因:查资料发现为浏览器的广告拦截功能导致. 补充: 1.一般情况下,js ...
- Https,Http,TCP,IP的一些理解
网络模型分为7层,应用层,表现层,会话层,传输层,网络层,链路层,物理层,每一层有很多不同的协议. http:属于应用层的协议,负责的是数据以什么结构传输也可以说成是打包成什么样子 SSL/TLS:属 ...
- js中树结构根据条件查找节点返回节点路径的一些思路
今天在项目中遇到一个问题,需要根据数据库中记录的树结构节点id获取该记录所在目录节点的路径. 大致想法,首先定义变量保存当前路径,然后递归遍历该树节点,在遍历的过程中将遍历到的节点加入到当前路径中,找 ...
- spring整合mybatis二种配置
第一种: <!-- 配置sqlsession --> <bean id="sqlsessionFactory" class="org.mybatis.s ...
- [转] List of OpenFlow Software Projects
List of OpenFlow Software Projects (that I know of) http://yuba.stanford.edu/~casado/of-sw.html (I a ...
- 关于C++用法的学习心得
通过大一一学期对C++语言的学习,我感觉c++是一门有一定难度并且很有挑战性的科目,在c++学习过程中,我们懂得了其有很多的用法. 引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确. ...
- FTP服务器搭建
FTP 服务器架设: 关闭防火墙 service iptables stop 关闭SELinux setenforce 0 安装所需依赖及编译工具 yum install -y gcc openssl ...
- FF中flash滚轮失效的解决方案
概述 在FF浏览器中有这样一个bug,就是当鼠标hover在flash区域的时候,滚轮会失效.原因是ff浏览器没有把滚轮事件嵌入到flash里面去.如果这个flash很小的话,比如直播的视频,会很容易 ...
- OAuth2简易实战(三)-JWT
1. OAuth2简易实战(三)-JWT 1.1. 与OAuth2授权码模式差别 授权服务器代码修改 @Configuration @EnableAuthorizationServer public ...