一、奇怪的返回

今天在搞监控的时候,修改一个老脚本,主要是通过对操作系统进行判断来获取不同的监控参数。(获取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. 反引号是老的用法,$()是新的用法,我们推荐使用$()。

Shell脚本之反引号【``】和 $()的更多相关文章

  1. Linux Shell 中的反引号,单引号,双引号

    反引号在 (`) 键盘的Tab键的上方.1键的左方.在Linux中起着命令替换的作用.命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置.如下,shell会执行反引号中的date命 ...

  2. Shell 中的反引号(`),单引号('),双引号(")

    在写shell的时候老是傻傻分不清楚,今天来理一理. 1.反引号位 (`) 位于键盘的Tab键的上方.1键的左方.注意与单引号(')位于Enter键的左方的区别. 在Linux中起着命令替换的作用.命 ...

  3. Shel脚本学习—反引号、单引号、双引号区别与联系

    反引号 反引号位 (`) 位于键盘的Tab键的上方.1键的左方.注意与单引号(')位于Enter键的左方的区别. 在Linux中起着命令替换的作用.命令替换是指shell能够将一个命令的标准输出插在一 ...

  4. Linux Shell中的反引号,单引号,双引号

    反引号位 (`) 位于键盘的Tab键的上方.1键的左方.注意与单引号(')位于Enter键的左方的区别. 在Linux中起着命令替换的作用.命令替换是指shell能够将一个命令的标准输出插在一个命令行 ...

  5. shell 脚本中双引号 单引号 反引号 的区别

    转自:http://blog.csdn.net/iamlaosong/article/details/54728393 最近要编个shell脚本处理数据,需要检测数据文件是否存在,文件名中包含日期,所 ...

  6. shell脚本中单双引号疑惑

    工作中常用到shell脚本,遇到了一个疑惑,求解.    常见的解释: 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单独一个的单引号(对单 ...

  7. shell脚本中的反引号使用 `

    反引号是~的英文切换 在shell脚本中,反引号允许将shell命令的输出赋值给变量. test=`date` 这样shell会执行反引号中的命令.并将执行的结果赋值给变量tests.

  8. Linux下Shell脚本字符串单引号、双引号、反引号、反斜杠的作用和区别

    一.单引号 str='this is a string' 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单引号(对单引号使用转义符后也不行) ...

  9. shell脚本中的反引号,单引号,双引号与反斜杠

    转自:http://blog.sina.com.cn/s/blog_6561ca8c0102we2i.html 反引号位 (`)经常被忽略,而且容易与单引号弄混.它位于键盘的Tab键的上方.1键的左方 ...

随机推荐

  1. js复制链接

    需求:js复制一个并非当前页面的链接 实现: html <button class="btn btn-primary btn_copyurl">复制课程链接</b ...

  2. Tuxedo:Tuxedo支持的分布式通信方式

    1.RPC:用于远程方法调用.Java中类似的技术有EJB.WebService 2.Conversaction:交流.Java中类似的有JDBC. 3.Message Notification:消息 ...

  3. Spring:Bean生命周期

    关于Bean生命周期,我在网上找了两张图: 图1: 图2: 总结起来就是: Bean构建: Bean对象创建 > @Autowired | @Resource> @PostConstruc ...

  4. web.config中配置数据库(多数据)连接的两种方式

    这是我的第一篇文章,既然是第一篇了,那就从最基础的只是说起--web.config中配置数据库连接. 网上有很多这方面的资料,但发现并没有一篇从头到位很清楚明了说完的,今天就把我的整理写在这里吧. 在 ...

  5. 查看Flink的Job Graph时的问题

    Flink运行Job时,可以通过Job Graph看到执行计划,但是如果用IE,会被坑: 换成谷歌Chrome,就OK了: 这个Job Grap,好像是SVG的,可能是IE不支持SVG,需要安装插件才 ...

  6. 微信小程序教学第三章(含视频):小程序中级实战教程:列表-页面逻辑处理

    § 页面逻辑处理 本文配套视频地址: https://v.qq.com/x/page/n0554dndrez.html 开始前请把 ch3-2 分支中的 code/ 目录导入微信开发工具 修改 ind ...

  7. DotNetCore跨平台~System.DrawingCore部署Linux需要注意的

    回到目录 你在windows上使用图像组件没有任务问题,但部署到linux之后,将注意以下几点: 安装nuget包ZKWeb.System.Drawing 项目里还是引用System.DrawingC ...

  8. 为什么覆写equals()方法的时候总是要覆写hashcode()?

    要回答这个问题,我们应该先认识一下obj中的equals和hascode方法 1.equals()方法在obj中定义如下: public boolean equals(Object obj) { re ...

  9. iOS 讯飞语音测试没问题,一上线就用不了了

    看一下打包的版本是不是release, Debug : 调试版本,主要是让程序员使用,在调试的过程中调用 Debug 会启动更多的服务来监控错误,运行速度相对较慢,而且比较耗能. Release : ...

  10. JavaWeb之数据源连接池(2)---C3P0

    我们接着<JavaWeb之数据源连接池(1)---DBCP>继续介绍数据源连接池. 首先,在Web项目的WebContent--->WEB-INF--->lib文件夹中添加C3 ...