zoukankan      html  css  js  c++  java
  • shell 脚本编程 IFS

    一、IFS 介绍

         Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符。完整定义是The shell uses the value stored in IFS, which is thespace, tab, and newline characters 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 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。

    二、IFS 简单实例

    1、查看变量 IFS 的值

    1. $ echo $IFS  
    2.   
    3. $ echo "$IFS" | od -b  
    4. 0000000 040 011 012 012  
    5. 0000004  

    直接输出IFS是看不到的,把它转化为二进制就可以看到了,"040"是空格,"011"是Tab,"012"是换行符" " 。最后一个 012 是因为 echo 默认是会换行的。

    2、$* 和 $@ 的细微差别
         从下面的例子中可以看出,如果是用冒号引起来,表示这个变量不用IFS替换!!所以可以看到这个变量的"原始值"。反之,如果不加引号,输出时会根据IFS的值来分割后合并输出! $* 是按照IFS中的第一个值来确定的!下面这两个例子还有细微的差别!

    1. $ IFS=:;  
    2. $ set x y z  
    3. $ echo $*  
    4. x y z  
    5. $ echo "$*"  
    6. x:y:z  
    7. $ echo $@  
    8. x y z  
    9. $ echo "$@"  
    10. x y z  

     上例 set 变量其实是3个参数,而下面这个例子实质是2个参数,即 set "x y z"  和 set x y z 是完全不同的。

    1. $ set "x" "y z"  
    2. $ echo $*  
    3. x y z  
    4. $ echo "$*"  
    5. x:y z  
    6. $ echo $@  
    7. x y z  
    8. $ echo "$@"  
    9. x y z  
    10. $ echo $* |od -b  
    11. 0000000 170 040 171 040 172 012  
    12. 0000006  
    13. $ echo "$*" |od -b  
    14. 0000000 170 072 171 040 172 012  
    15. 0000006  

    小结:$* 会根据 IFS 的不同来组合值,而 $@ 则会将值用" "来组合值!

    ps:有图有真相 一看就明白  $*和$@ 的区别

    转自:http://blog.csdn.net/whuslei/article/details/7187639

  • 相关阅读:
    团队冲刺第二阶段4
    团队冲刺第二阶段3
    Kibana客户端安装
    Elasticsearch安装IK分词器
    ElasticSearch 安装笔记
    smtp邮件发送
    5.28 vue2的diff算法
    4.24observer中并不会出现类似obj.data.name读取时,obj的data与data的name都出现被读取的现象。(改正错误!)
    4.1 原来cookie由浏览器管理!(服务端返回cookie后,浏览器保存cookie,再次发起http请求时会包含一个cookie的头部)
    4.1 HTTP请求中的Form Data与Request Payload的区别
  • 原文地址:https://www.cnblogs.com/loongqiang/p/3395491.html
Copyright © 2011-2022 走看看