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

摘要:
msg变量里存储的各个单词都是用空格分开的,而for能依次取出这些单词,正是依靠IFS这个变量作为分隔符。如果将msg变量改为CSV格式,那么按照默认的IFS值就无法解析出各个单词,如:shtemp.shItem:welcome,to,www,groad,net这样,整个字符串就当成一个item被获取了。/bin/shdata="welcome,to,www,groad,net"IFSBAK=$IFS#备份原来的值IFS=,foritemin$datadoechoItem:$itemdoneIFS=$IFSBAK#还原运行输出:#shtmp.shItem:welcomeItem:toItem:wwwItem:groadItem:net#################shell中字分隔的妙用:变量IFSshell中字分隔的妙用:变量IFSshell把每个$IFS字符对待成一个分隔符,且基于这些字符把其他扩展的结果分割。为了解决这一问题,可用$IFS变量:#!
IFS 的全称是 Interal Field Separator ,即“内部区域分隔符”,它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space character),制表符(tab) 以及新行(newline) 。先看下面一个简单示例:
1
2
3
4
5
6
7
8
#!/bin/sh
msg="welcome to www groad net"
foritem 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=,
foritem in$data
do
echoItem: $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:506:100::/home/test33:/bin/bash
test44:x:507:512::/home/test44:/bin/bash
test55:x:508:100::/home/test55:/bin/bash
test66:x:509:100::/home/test66:/bin/bash
假如/etc/passwd中有第五列,即注释,恰恰注释中包含空格,如下:
test33:x:506:100::/home/test33:/bin/bash
test44:x:507:512::/home/test44:/bin/bash
test55:x:508:100::/home/test55:/bin/bash
test66:x:509:100:user test1:/home/test66:/bin/bash
执行的结果是什么呢,乱了:
test33:x:506:100::/home/test33:/bin/bash
test44:x:507:512::/home/test44:/bin/bash
test55:x:508:100::/home/test55:/bin/bash
test66:x:509:100:user
test1:/home/test66:/bin/bash
程序把注释中的空格看作字分隔符了。为了解决这一问题,可用$IFS变量:
#!/bin/bash
IFS_old=$IFS      #将原IFS值保存,以便用完后恢复
IFS=$’
’        #更改IFS值为$’
’ ,注意,以回车做为分隔符,IFS必须为:$’
’
for i in`cat m.txt`
do
        echo $i
done
IFS=$IFS_old      #恢复原IFS值
再次运行,得到预期结果:
test33:x:506:100::/home/test33:/bin/bash
test44:x:507:512::/home/test44:/bin/bash
test55:x:508:100::/home/test55:/bin/bash
test66:x:509:100:user test1:/home/test66:/bin/bash

免责声明:文章转载自《转 shell中字分隔的妙用:变量IFS》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java之异常机制(1)Linux下MySQL所在磁盘,线程,内存的配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转]解决Xilinx Platform Studio无法打开 设置 环境变量

我安装好Xilinx ISE Design Suit 12.3后,ISE可以正常打开,但是Xilinx Platform Studio却无法打开,弹出的DOS窗口提示说——“Environment variable XILINX is not set - A compatible version of ISE tools must be installed...

Flask(Jinja2) 服务端模板注入漏洞vulhub

Flask(Jinja2) 服务端模板注入漏洞vulhub 前言 Flask简介 Flask 是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序。这个 web 应用程序可以是一些 web 页面、博客、w...

Rust中的变量的声明和定义

变量的声明和定义 Rust中合法的标识符(包括变量名、函数名、triat名等)必须由数字、字母、下划线组成,而且不能以数字开头。这个和很多语言都是一样的。Rust将来也会允许其他Unicode字符作为标识符,还有raw identifier功能,这样可以使关键字作为标识符,比如r#self,这个用途在FFI中最多。 变量的声明: let variable...

蓝桥杯Java——安装软件Eclipse以及JDK

蓝桥杯Java——安装软件Eclipse以及JDK 安装Eclipse 安装JDK 检查JDK是否安装成功 安装Eclipse 安装后打开失败 安装Eclipse 安装JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html 选择需要的版本 在页面底部找到如...

shell脚本之三:shell变量知识进阶与实践

三、SHELL变量知识进阶与实践 (一)shell特殊位置变量 1.获取脚本的名字($0) $0:获取脚本的名字,如果脚本前跟着路径的话,那就获取路径加上脚本名字。 企业应用:一般在脚本最后,使用$0获取脚本的路径和名字给用户。 2、获取脚本的第n个参数($n) $n:获取脚本后的第n个参数,n大于9以后,数字需要用大括号括起来。 企业应用:脚本中,提取...

Shell与进程

查看当前运行的进程 名称: ps使用权限: 所有使用者 使用方式: ps [options] [--help] 说明: 显示瞬间行程 (process) 的动态 参数: ps的参数非常多, 在此仅列出几个常用的参数并大略介绍含义 常用参数 -A 显示所有进程(等价于-e)(utility) -a...