IFS 的全称是 Interal Field Separator  ,即“内部区域分隔符”,它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space  character),制表符(tab) 以及新行(newline) 。先看下面一个简单示例:

1
2
3
4
5
6
7
8
#!/bin/sh
 
msg="welcome to www groad net"
 
for item in $msg
do
    echo "Item: $item"
done

运行输出:

# sh temp.sh Item: welcome Item: to Item: www Item: groad Item: net

上 面用一个 for 循环遍历了变量 msg 里的所有项。 msg 变量里存储的各个单词都是用空格分开的,而 for 能依次取出这些单词,正是依靠  IFS 这个变量作为分隔符。如果将 msg 变量改为 CSV (comma separaed values 逗号分隔值)格式,那么按照默认的  IFS 值就无法解析出各个单词,如:

sh temp.sh Item: welcome,to,www,groad,net

这样,整个字符串就当成一个 item 被获取了。
此时如果仍然希望逐个获得各个单词,那么需要修改 IFS 变量的值,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
 
data="welcome,to,www,groad,net"
 
IFSBAK=$IFS     #备份原来的值
 
IFS=,
 
for item in $data
do
    echo Item: $item
done
 
IFS=$IFSBAK     #还原

运行输出:

# sh tmp.sh Item: welcome Item: to Item: www Item: groad Item: net

 
#################
 
 
shell中字分隔的妙用:变量IFS
 
shell中字分隔的妙用:变量IFS

shell把每个 $IFS 字符对待成一个分隔符,且基于这些字符把其他扩展的结果分割。如果 IFS 未设置,或者它的值正好是 “‘’”,那么任何IFS 字符的序列就送往分割字。

自写一个简单的脚本:
#!/bin/bash
for i in `cat /etc/passwd`
do
echo $i
done
输出结果:
test33:x::::/home/test33:/bin/bash
test44:x::::/home/test44:/bin/bash
test55:x::::/home/test55:/bin/bash
test66:x::::/home/test66:/bin/bash 假如/etc/passwd中有第五列,即注释,恰恰注释中包含空格,如下:
test33:x::::/home/test33:/bin/bash
test44:x::::/home/test44:/bin/bash
test55:x::::/home/test55:/bin/bash
test66:x:::user test1:/home/test66:/bin/bash 执行的结果是什么呢,乱了:
test33:x::::/home/test33:/bin/bash
test44:x::::/home/test44:/bin/bash
test55:x::::/home/test55:/bin/bash
test66:x:::user
test1:/home/test66:/bin/bash 程序把注释中的空格看作字分隔符了。为了解决这一问题,可用$IFS变量:
#!/bin/bash
IFS_old=$IFS #将原IFS值保存,以便用完后恢复
IFS=$’\n’ #更改IFS值为$’\n’ ,注意,以回车做为分隔符,IFS必须为:$’\n’
for i in `cat m.txt`
do
echo $i
done
IFS=$IFS_old #恢复原IFS值 再次运行,得到预期结果:
test33:x::::/home/test33:/bin/bash
test44:x::::/home/test44:/bin/bash
test55:x::::/home/test55:/bin/bash
test66:x:::user test1:/home/test66:/bin/bash

 

转 shell中字分隔的妙用:变量IFS的更多相关文章

  1. shell中的特殊符号总结

    在shell中常用的特殊符号罗列如下: # ;   ;; . , / \\ 'string'| !   $   ${}   $? $$   $* \"string\"* **   ...

  2. (二)shell中case语句、程序传参、while

    2.2.6.1.case语句(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异(2)shell中的case语句天生没有break,也不需要break,和C语言中 ...

  3. shell中的环境变量

    局部(local)环境变量 定义局部环境变量的方式如下: variableName=value 需要注意的是variableName前面没有$符号,并且=两边没有空格. 局部环境变量只能在当前shel ...

  4. SHELL中的特殊变量和结构

    SHELL中的特殊变量和结构 表格 B-1. 特殊的shell变量 变量 含义 $0 脚本名字 $1 位置参数 #1 $2 - $9 位置参数 #2 - #9 ${10} 位置参数 #10 $# 位置 ...

  5. shell中{}的妙用

    shell中${}的妙用   1. 截断功能 ${file#*/}:       拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:    拿 ...

  6. shell中eval命令妙用——变量嵌套替换

    eval命令妙用--变量嵌套替换 eval命令在Linux下的应用非常广泛,在写脚本的时候遇到一个变量嵌套的问题,用eval迎刃而解,略试不爽啊. var1="hello" i=1 ...

  7. shell中常用的特殊符号

    在shell中常用的特殊符号罗列如下: # ; ;; . , / \ 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# $@ `co ...

  8. linux shell中的特殊符号

    该内容,均来自此网址(http://www.92csz.com/study/linux/12.htm).在下只是把那些命令的截图给去了. 你在学习linux的过程中,也许你已经接触过某个特殊符号,例如 ...

  9. shell中的特殊符号

    Shell符号及各种解释对照表: Shell符号 使用方法及说明 # 注释符号(Hashmark[Comments]) 1.在shell文件的行首,作为shebang标记,#!/bin/bash; 2 ...

随机推荐

  1. <?php function say() { echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()

    <?php function say() {     echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()

  2. Java 多态 父类和子类方法的访问控制权限

    Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...

  3. Matlab - 线性方程组求解

    常用函数:det 计算矩阵的行列式的值inv 求矩阵的逆阵rank 求矩阵的秩[V D]=eig(A) 求矩阵A的特征值和特征向量poly 求矩阵的特征多项式rref 用初等变换将矩阵化成行阶梯形nu ...

  4. Sublime Text学习笔记

    1.快捷键(Key Bindings)   Preferences -> Key Bindings ->Default   会打开一个配置文件,里面全是配置信息 2.代码片段(Snippe ...

  5. mnesia

    1.模式创建 mnesia:create_schema([node()|nodes()]).集群的节点之间创建模式 2.启动和停止 application:start(mnesia). applica ...

  6. E - 小晴天老师系列——我有一个数列!

    E - 小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/O ...

  7. 杭电21题 Palindrome

    Problem Description A palindrome is a symmetrical string, that is, a string read identically from le ...

  8. MemoryStream 转 pdf

    在项目开发中用到将MemoryStream 转pdf,在转化过程中需要建了一个.dom格式的模板,先保存为.doc文件,然后再转换为.pdf. 有一个插件感觉好不错,给大家推荐一下. dll下载链接  ...

  9. Shell脚本中让进程休眠的方法(sleep用法)

    有时候写Shell的脚本,用于顺序执行一系列的程序. 有些程序在停止之后并没能立即退出,就例如有一个 tomcat 挂了,就算是用 kill -9 命令也还没瞬间就结束掉. 这么如果 shell 还没 ...

  10. AccessToMySql数据库的导入以及java生成.exe文件

    一.AccessToMySql 最近做了一个Access数据库导入MySql的小工具,期间遇到诸多问题,这里小计一下. 表名为cur_rec,共有5个字段 比较奇葩的是这个表居然是四个字段的联合主键, ...