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. HDU 1969 Pie(二分查找)

    Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no ...

  2. c#笔记之启动新线程

    可已通过下面方法来启动一个新线程并执行相应的方法 new Thread(new ThreadStart(new Action(() =>                        {     ...

  3. ESFramework 4.0 进阶(04)-- 驱动力:通信引擎(下)

    在ESFramework 4.0 进阶(03)-- 驱动力:通信引擎(上)一文中,我们对ESFramework提供的每一个通信引擎的接口都做了详细了说明,这篇文章我们将继续探讨这些接口的实现类 -- ...

  4. LeetCode OJ 1. Two Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  5. 当用反射获取一个model,这个model里面字段有nullable的时候,获取字段真实类型

    Using Reflection to Determine whether an Type is Nullable And Get the underlying Type /// <summar ...

  6. Brackets + Sass 学习心得

    大家知道Brackets是一个可以实时浏览html页面修改效果的工具,对于前段开发人员应该不会陌生,有了它,布局页面再也不是什么困难了, 目前为止已经更新到1.6了. 下载最新版可以到官方网: htt ...

  7. json 与entity/list/map的转换

    一  json -> entity User.java package com.xxx.hotel.train.json.json2entity; import java.io.Serializ ...

  8. virtualbox+centos 7 实现宿主机器互通

    1.centos7iso文件 2.安装教程地址,www.aiplaypc.com/102.html 3.修改ip地址 使用命令 vi /etc/sysconfig/network-scripts/if ...

  9. HDU 2722 Here We Go(relians) Again (spfa)

    Here We Go(relians) Again Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/ ...

  10. 设计模式--静态工厂设计模式在android中的使用

    今天看到这篇文章:http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html public c ...