一、奇怪的返回

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

脚本如下,非常简单:

#处理Centos7采集磁盘使用率问题
os_version=`cat /etc/issue|grep -w "\\\S"|wc -l`
if [ $os_version -eq 1 ];thenecho $os_version
elseecho '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 ];thenecho $os_version
elseecho 'aaa'
fi

 

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

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

三、解决

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

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

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

四、总结

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

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

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

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

转载于:https://www.cnblogs.com/skyflask/p/7742208.html

Shell脚本之反引号【``】和 $()相关推荐

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

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

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

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

  3. shell 脚本中双引号、单引号、反引号的区别,其他命令

    如果make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果; Android中会定义某个变量等于@,例如 hide:= @ 通常make执行的命令如果出错(该命令的退出状态非0)就立刻终止 ...

  4. Shell脚本中 双引号(“”)单引号(‘’)反引号(``)的区别

    1.由单引号括起来的字符都作为普通字符出现.特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释. 2.由双引号括起来的字符,除$(美元符号).\(反斜杠).'(单引号).和" ...

  5. Bash 脚本:`(反引号)运算符和 $()的使用方式

    ` 反引号操作符可以在 shell 脚本中使用,因为它很容易与其他命令结合使用.但是,还有一种更"推荐"的方式来做同样的事情,使用$()运算符.本文将介绍在 shell 脚本中使用 ...

  6. shell脚本--三种引号的区别

    shell脚本中,三种引号分别为:单引号(''),双引号(""),反引号(``),反引号就是键盘esc下面的那个键. (1) 单引号:在单引号之间的内容,是不会被解析的,会原样输出 ...

  7. Linux shell脚本中单双引号的区别

  8. shell脚本中单引号和双引号

     shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符.单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号.(注意是所有,只是单引 ...

  9. shell中单引号、双引号、反引号、反斜杠的使用

    shell可以识别4种不同类型的引字符号: 单引号字符('') 双引号字符("") 反斜杠字符(\) 反引号字符也就是ESC下方的键(`) 1. 单引号 ( '' ) :当shel ...

最新文章

  1. jQuery源码解析对象实例化与jQuery原型及整体构建模型分析(一)
  2. centos oracle命令,CentOS7命令行方式搭建Oracle11gR2
  3. Spring5源码 - 02 Bean和Java对象的区别与猜想验证BeanDefinition
  4. Object类toString()和equals()方法剖析
  5. 流水线技术在高速数字电路设计中的应用
  6. 实战!阿里神器 Seata 实现 TCC模式 解决分布式事务,真香!
  7. 【报告分享】2020中国248家独角兽报告.pdf(附下载链接)
  8. 甲骨文超 IBM 成全球第二大软件公司
  9. 联想电脑硬盘保护系统EDU8.0.1iso安装
  10. CPU使用率和负载Load计算方法
  11. 如何将heic格式转化jpg?
  12. python云计算有哪些岗位_云计算就业前景怎么样,包括哪些岗位,各岗位主要工作是什么?...
  13. 方阵平方等于自身,这个方阵的特征值
  14. 怎么简化学生入校查询健康码和测温的流程-校园健康码查询平台,校园安防平台,家校互动平台
  15. 关于未将对象引用设置到对象实例简单原理分析,与解决方法
  16. Windows 11 22H2 (KB5017321) 更新失败并显示下载错误 0x800F0806
  17. 基于C语言的网络电子词典
  18. 支付宝自动跳入转账页面
  19. git执行任何操作都特别慢,怎么解决?
  20. salmon:sailfish的升级版本

热门文章

  1. 计算机系统概论寻址空间,自考《计算机系统结构》重点知识概论:数据表示(二)...
  2. java graphics 类_对于 Graphics 类的一点认识(转)
  3. laravel的composer require报错:Installation failed, reverting ./composer.json to its original content.
  4. 【C++ STL】vector库使用方法
  5. 【深度学习】带有 CRF-RNN 层的 U-Net模型
  6. 【深度学习】讲一个深度分离卷积结构和空洞卷积的应用
  7. git和github的关系
  8. linux无法运行病毒,{转}为什么linux系统不容易中病毒?
  9. 进阶学习(3.7) Flyweight Pattern 享元模式
  10. 湖南网络推广教大家如何“挽回”网站被降权的排名和权重?