Shell脚本中有个变量叫 IFS(Internal Field Seprator),内部域分隔符。

完整定义:

The shell uses the value stored in IFS, which is the space, tab, and newlinecharacters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substitution.

Shell 的环境变量分为 set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。

set 是显示设置shell变量,仅在本 shell 中有效;

env 是显示设置用户环境变量 ,仅在当前会话中有效。

换句话说,set 变量里包含了 env 变量,但 set 变量不一定都是 env 变量。

这两种变量不同之处在于变量的作用域不同。

显然,env 变量的作用域要大些,它可以在 subshell 中使用。

IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。

#  STRING1="111 222 333 444"

#   echo $STRING1

#   echo "$STRING1"

这组代码没什么好说的,输出的是:111 222 333 444,它的作用是和下面那段做对比!

#  STRING2="111 222  333   444"

#  echo $STRING2

#  echo "$STRING2"

输出的结果是

111 222 333 444

111 222  333   444

为什么?

第一个输出的结果明显不对,难道输出了的是STRING1的值,明显不可能,这就是IFS的鬼伎俩!

首先介绍一下这个家伙,IFS是shell内定的一个变量,默认定义的值为 3个,不好意思,这3个值我打出来也看不见,只能写英文。

那IFS的作用是什么了,它的作用就是把字符串里的某某字符(和它一样的字符,例如上面的)转义成分隔符。

例如"111 222  333   444",这个字符串其实就是 111222333444

因为IFS里也有个空格,所以在它眼中就是分隔符,所以"111 222  333   444"在它看来就是这个鬼样子111222333< 分隔符>444

分隔符(不是所有的分隔符都会合并,空格是个例外)进行合并,所以就成了111222333444,而这该死的偏偏显示出来和一个空格是一样的(或者说空格被用来表示分隔符),所以显示出来就变成了"111 222 333 444"。

最终,你 echo $STRING2 显示出来的是"111 222 333 444",echo "$STRING2"之所以还是保持原样是因为""它屏蔽了IFS的功能!

如果我这样改下,将分隔符改成& ,结果就一样了,这时候shell就不会认为空格是分隔符了,倒是&符号要倒霉了 !

#  IFS='&'

#  STRING2="111 222  333   444"

#  echo $STRING2

111 222  333   444

# echo "$STRING2"

111 222  333   444

$* 指的是脚本入口参数的字符串集,是一个全局变量

你在终端输入一个脚本,带了3个参数:

# ./script 111 222 333

那么 echo $* 输出的就是111 222 333,这没什么问题,但是下面的东西就又忽悠人了!

首先是这段代码:

#  IFS='&'

#  STRING2="111&222&&333&&&444"

#  echo $STRING2

#  echo "$STRING2"

输出的是

111  222  333   444

111&222&&333&&&444

经过上面的解释,就不难理解了

因为IFS='&',所以字符串里的&全成了分隔符,所以第一个输出的是 111 222 333 444

现有一组代码,在终端运行:

# ./script 111 222  333   444

########################

IFS='&'

echo $*

echo "$*"

#########################

输出的是:

111 222 333 444

111&222&333&444

因为$*等于111IFS222IFS333IFS444,亦等于111&222&333&444

echo $* 时,&代表分隔符,所以要转换成空格 ,而第二行由于双引号 "" 的作用使得&没有进行转换。

参考

详解shell中的IFS变量

https://blog.csdn.net/guyongqiangx/article/details/80220434

Shell中的IFS解惑

https://blog.csdn.net/whuslei/article/details/7187639

shell 中IFS分隔符

http://xstarcd.github.io/wiki/shell/IFS.html

关于read命令的一个小问题

http://bbs.chinaunix.net/thread-207178-1-1.html

Linux read 命令

http://www.runoob.com/linux/linux-comm-read.html

linux shell ifs,【shell】IFS和$*变量相关推荐

  1. linux shell bash -c $IFS ${IFS}

    root@out:~# aa='echo${IFS}-e${IFS}-n${IFS}"123\\\n456"' root@out:~# bash -c $aa; 123\n456r ...

  2. shell中的IFS

    一.IFS 介绍 Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符.完整定义是The shell uses the value stored in ...

  3. shell实例第22讲:shell中分隔符IFS用法

    shell中分隔符IFS用法 1.什么是IFS? IFS在shell中是分隔符的意思,即IFS这个变量中存放了分隔符. 2.IFS是全局变量还是局部变量? (1)linux中变量分两种:全局变量env ...

  4. Linux内部字段分离符环境变量IFS

    Linux内部字段分离符环境变量IFS:用于bash shell,默认bash shell 会将空格.制表符/t.换行符/n 当成字段分隔符 arr=(/pubsentiment?action=che ...

  5. Shell中的IFS解惑

    一.IFS 介绍 Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符.完整定义是The shell uses the value stored in ...

  6. [Linux]Shell的运算符和特殊变量

    说起Shell脚本,免不了用变量.特别是对于这种一堆符号表示变量的语言来说,你不了解一下相关变量的本意,根本无从下手.譬如写个循环遍历,$#就起了好大作用.所以还是有必要记录一下,也是对学习的一个笔记 ...

  7. 【shell脚本】——IFS的概念和用法

    IFS的概念和方法 参考 IFS的概念 查看IFS的默认值 查看IFS的值对应的字符编码 IFS导致的非理想的分割例子 取得理想结果 参考 https://www.cnblogs.com/guxd/p ...

  8. shell中设置IFS,使用自定义分割符

    1.概述 在bash中,IFS(Internal Filed Separator,内部域分隔符)是一种 set 变量,当 shell 处理字符串时,shell会根据 IFS 的值,默认是空格.Tab键 ...

  9. Linux下的Shell编程(2)环境变量和局部变量

    Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型. 局部变量在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量.这些变量与环境变量不 ...

  10. Linux基础之shell变量

    Linux基础之shell变量 一.shell变量及其他相关介绍 二.shell变量类型 三.shell变量用法 四.定义命令别名 五.系统变量文件定义说明 一.shell变量及其他相关介绍 1.编译 ...

最新文章

  1. R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA)、使用HH包中的interaction2wt函数为任何阶的双因素方差分析可视化主效应和交互作用图、箱图显示主效应
  2. GARFIELD@09-28-2004
  3. 前端框架Bootstrap 教程
  4. 在存储过程中如何使用另一个存储过程返回的结果集
  5. java并发编程与线程安全
  6. Eclipse Tomcat调试timeout超时怎么办
  7. spring + shiro + cas 实现sso单点登录
  8. Linux学习:shell 命令(用户管理)
  9. LeetCode 437. 路径总和 III(双重递归)
  10. java ac自动机_如何使用Java实现AC自动机全文检索实例
  11. 马哥学习李洋个人笔记之-----正则表达式
  12. linux mint关于web开发的相关环境配置
  13. L1-010 比较大小 (10 分)—团体程序设计天梯赛
  14. 似然(Likelihood)
  15. 8款微信公众号编辑器,哪个最好用?
  16. Flash的荣辱兴衰史【转载】
  17. IDEA 设置 vue 支持开发
  18. uniapp苹果无法上架_uniapp无法上架IOS包怎么办
  19. python数据分析案例简单实战项目(二)--疫情数据分析
  20. 计算机网络常见面试知识点总结

热门文章

  1. mysql主从配置duxi_手把手超详细Docker部署MongoDB集群
  2. 网红直播天水人间主播大秀
  3. mysql中flush用法,flush 的常规用法:
  4. Java实现图书管理小练习(赌包辣条看完绝对会~)
  5. 16、Mediator 仲裁者模式
  6. 电商项目 java 毕业设计_Java电商毕业设计总结(二)
  7. 12个EMC设计标准电路
  8. 华为android9手机短信不提醒设置,华为手机微信不提醒怎么办 华为收不到微信提示信息多种解决方法...
  9. 《统计学习导论》R语言代码整理
  10. 20-40K/月,百度车联网招聘多岗位Android工程师(地点:深圳)