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个可能地加上引号来保护空白字符。

最新文章

  1. Living in the Matrix with Bytecode Manipulation--转
  2. AOJ 0118 Property Distribution【DFS】
  3. java List<Item> its=new ArrayList<Item>(); Map按value中的某字段排序
  4. hadoop2的高可用性
  5. GSM Hacking Part② :使用SDR捕获GSM网络数据并解密
  6. 转载:align
  7. Hadoop概述
  8. php基础知识【函数】(1)数组array
  9. PHP多种序列化/反序列化的方法 (转载)
  10. DSAPI 截取被遮挡的窗口图像
  11. 回温js算法
  12. 前端技术之--CSS
  13. css实现垂直水平居中的方法(个数不限)?
  14. vbs 去掉字符串中的空格
  15. WPF PrismDialog PopupWindowAction使用MetroWindow
  16. R语言之正则表达式
  17. linux虚拟机ping不通主机和外网(包括刚装系统遇到的一些问题)
  18. mfc Edit控件属性
  19. jPlayer插件的使用
  20. java实现windows下amr转换为mp3(可实现微信语音和qq语音转换)

热门文章

  1. extjs__(grid Panel绑定数据)
  2. autium designer 软件使用:
  3. vuex简单使用
  4. 10-Mock模拟接口返回数据
  5. build.gradle
  6. JVM运行时数据区(一)
  7. 一分钟理解 HTTPS 到底解决了什么问题
  8. Kali学习笔记37:APPSCAN
  9. dubbo实用知识点总结(二)
  10. H5拖动实现代码