zoukankan      html  css  js  c++  java
  • Shell脚本之反引号【``】和 $()

    一、奇怪的返回

    今天在搞监控的时候,修改一个老脚本,主要是通过对操作系统进行判断来获取不同的监控参数。(获取top参数在不同操作系统上也有个坑,会在另外一篇里面写)

    脚本如下,非常简单:

    #处理Centos7采集磁盘使用率问题
    os_version=`cat /etc/issue|grep -w "\S"|wc -l`
    if [ $os_version -eq 1 ];then
      echo $os_version
    else
      echo 'aaa'
    fi
    

      

    本来逻辑和语法都非常简单,没想到结果却出人意料。

    我只是希望通过issue判断系统是否为centos7,如果是,则输入S;如果不是,则输出‘aaa’.

    但是发现不管是在centos7还是centos6上,结果都是输出aaa。

    Centos7上:

     Centos6上:

     

    那到底是什么原因呢?

    二、真相--反引号``惹的祸

     经过-x输出查看,发现结果都是出乎意料的2。因为结果是全部匹配,所以沉思许久还是不得其解。而且我也考虑到了特殊符号的转义问题,那又是还有其他什么问题呢?

    因为在shell中执行命令并赋值给变量有两种方式,另外一种方式是用$(),例如a=$(cat /etc/issue).那就用第二种方式测试一下吧。

    1、将脚本修改:

    os_version=$(cat /etc/issue|grep -w "\S"|wc -l) #修改成$()方式
    if [ $os_version -eq 1 ];then
      echo $os_version
    else
      echo 'aaa'
    fi
    

     

    2、在不同环境测试,发现结果正确了!

    看来问题就出在反引号上!

    三、解决

    既然知道了是反引号的问题,解决办法就有了。我们先测试一下:

    已经毫无疑问了,正是反引号的问题。那么反引号和$()有什么区别呢?

    发现使用反引号时,需要将转义符再次进行转义!!

    四、总结

    从上面整个过程我们可以看出:

    1. 在shell脚本中使用反引号时,他本身就对做了一层转义,如果你有需要匹配的的情况的话,需要再次进行转义。所以在反引号中,两个转义符才是进行转义!

    2. $()中则不需要考虑的问题,与我们平常使用的一样: = 。且自己转义后,他还是识别转义符。

    3. 反引号是老的用法,$()是新的用法,我们推荐使用$()。
  • 相关阅读:
    NSArray的几个方法的简单使用
    内存管理常用知识点总结
    iOS是开发之 对数组中的元素排序后输出
    iOS开发之——单例的几种设计方式
    图论二:图的存储
    图论一:基本概念
    树状数组(hdu-4325,hdu-1166,pat-1057)
    pat1079+1086+1090+1094(树的遍历)感想
    pat 甲级 1086(树的遍历||建树)
    static关键字的功能
  • 原文地址:https://www.cnblogs.com/skyflask/p/7742208.html
Copyright © 2011-2022 走看看