转 shell中字分隔的妙用:变量IFS
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
#!/bin/shmsg="welcome to www groad net"for item in $msgdo    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/shdata="welcome,to,www,groad,net"IFSBAK=$IFS     #备份原来的值IFS=,for item in $datado    echo Item: $itemdoneIFS=$IFSBAK     #还原 | 
运行输出:
# sh tmp.sh Item: welcome Item: to Item: www Item: groad Item: net
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的更多相关文章
- shell中的特殊符号总结
		
在shell中常用的特殊符号罗列如下: # ; ;; . , / \\ 'string'| ! $ ${} $? $$ $* \"string\"* ** ...
 - (二)shell中case语句、程序传参、while
		
2.2.6.1.case语句(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异(2)shell中的case语句天生没有break,也不需要break,和C语言中 ...
 - shell中的环境变量
		
局部(local)环境变量 定义局部环境变量的方式如下: variableName=value 需要注意的是variableName前面没有$符号,并且=两边没有空格. 局部环境变量只能在当前shel ...
 - SHELL中的特殊变量和结构
		
SHELL中的特殊变量和结构 表格 B-1. 特殊的shell变量 变量 含义 $0 脚本名字 $1 位置参数 #1 $2 - $9 位置参数 #2 - #9 ${10} 位置参数 #10 $# 位置 ...
 - shell中{}的妙用
		
shell中${}的妙用 1. 截断功能 ${file#*/}: 拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}: 拿 ...
 - shell中eval命令妙用——变量嵌套替换
		
eval命令妙用--变量嵌套替换 eval命令在Linux下的应用非常广泛,在写脚本的时候遇到一个变量嵌套的问题,用eval迎刃而解,略试不爽啊. var1="hello" i=1 ...
 - shell中常用的特殊符号
		
在shell中常用的特殊符号罗列如下: # ; ;; . , / \ 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# $@ `co ...
 - linux shell中的特殊符号
		
该内容,均来自此网址(http://www.92csz.com/study/linux/12.htm).在下只是把那些命令的截图给去了. 你在学习linux的过程中,也许你已经接触过某个特殊符号,例如 ...
 - shell中的特殊符号
		
Shell符号及各种解释对照表: Shell符号 使用方法及说明 # 注释符号(Hashmark[Comments]) 1.在shell文件的行首,作为shebang标记,#!/bin/bash; 2 ...
 
随机推荐
- HDU 1969 Pie(二分查找)
			
Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no ...
 - c#笔记之启动新线程
			
可已通过下面方法来启动一个新线程并执行相应的方法 new Thread(new ThreadStart(new Action(() => { ...
 - ESFramework 4.0 进阶(04)-- 驱动力:通信引擎(下)
			
在ESFramework 4.0 进阶(03)-- 驱动力:通信引擎(上)一文中,我们对ESFramework提供的每一个通信引擎的接口都做了详细了说明,这篇文章我们将继续探讨这些接口的实现类 -- ...
 - 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 ...
 - 当用反射获取一个model,这个model里面字段有nullable的时候,获取字段真实类型
			
Using Reflection to Determine whether an Type is Nullable And Get the underlying Type /// <summar ...
 - Brackets + Sass 学习心得
			
大家知道Brackets是一个可以实时浏览html页面修改效果的工具,对于前段开发人员应该不会陌生,有了它,布局页面再也不是什么困难了, 目前为止已经更新到1.6了. 下载最新版可以到官方网: htt ...
 - json 与entity/list/map的转换
			
一 json -> entity User.java package com.xxx.hotel.train.json.json2entity; import java.io.Serializ ...
 - virtualbox+centos 7 实现宿主机器互通
			
1.centos7iso文件 2.安装教程地址,www.aiplaypc.com/102.html 3.修改ip地址 使用命令 vi /etc/sysconfig/network-scripts/if ...
 - HDU 2722 Here We Go(relians) Again  (spfa)
			
Here We Go(relians) Again Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/ ...
 - 设计模式--静态工厂设计模式在android中的使用
			
今天看到这篇文章:http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html public c ...