• 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. 反引号是老的用法,$()是新的用法,我们推荐使用$()。
  • 相关阅读:
    数据库-第六章 关系数据理论-6.2.1 函数依赖
    数据库-第六章 关系数据理论-6.1 问题的提出
    编译原理-第四章 语法分析-4.4 自顶向下的语法分析
    计算机组成及系统结构-第五章 指令系统
    编译原理-第四章 语法分析-4.3 设计文法
    Java数据结构之堆和优先队列
    进程与线程杂谈
    Java的多态浅谈
    Java的自定义注解使用实例
    elasticsearch6.6.2在Centos6.9的安装
  • 原文地址:https://www.cnblogs.com/skyflask/p/7742208.html
Copyright © 2020-2023  润新知