Shell脚本之反引号【``】和 $()

时间:2022-02-07 21:46:55

一、奇怪的返回

今天在搞监控的时候,修改一个老脚本,主要是通过对操作系统进行判断来获取不同的监控参数。(获取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上:

Shell脚本之反引号【``】和 $()

 Centos6上:

 Shell脚本之反引号【``】和 $()

那到底是什么原因呢?

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

 经过-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、在不同环境测试,发现结果正确了!

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

三、解决

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

Shell脚本之反引号【``】和 $()

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

Shell脚本之反引号【``】和 $()

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

四、总结

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

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

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

  3. 反引号是老的用法,$()是新的用法,我们推荐使用$()。