一、奇怪的返回
今天在搞监控的时候,修改一个老脚本,主要是通过对操作系统进行判断来获取不同的监控参数。(获取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、在不同环境测试,发现结果正确了!
看来问题就出在反引号上!
三、解决
既然知道了是反引号的问题,解决办法就有了。我们先测试一下:
已经毫无疑问了,正是反引号的问题。那么反引号和$()有什么区别呢?
发现使用反引号时,需要将转义符再次进行转义!!
四、总结
从上面整个过程我们可以看出:
-
在shell脚本中使用反引号时,他本身就对做了一层转义,如果你有需要匹配的的情况的话,需要再次进行转义。所以在反引号中,两个转义符才是进行转义!
-
$()中则不需要考虑的问题,与我们平常使用的一样: = 。且自己转义后,他还是识别转义符。
- 反引号是老的用法,$()是新的用法,我们推荐使用$()。