一、奇怪的返回

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

    1.打开pycharm, 点击File>Open找到mySpider项目导入 . 2.打开File>Settings>Project 点击Project Interpreter 右边 ...

  2. IIS 5.x与ASP.NET

    转自:http://www.cnblogs.com/artech/archive/2009/06/20/1507165.html 我们先来看看IIS 5.x是如何处理基于ASP.NET资源(比如.as ...

  3. case

    case $变量 in "值1") 执行语句; ;; "值2") 执行语句; ;; ... *) 默认执行语句 ;; esac #!/bin/bash read ...

  4. C++ 知识点总结复习

    C++ 1.C++是静态类型语言,使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查. 2.面向对象程序设计 C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性: 封 ...

  5. tp3.2 事务处理

    事务的机制通常被概括为“ACID”原则即原子性(A).稳定性(C).隔离性(I)和持久性(D).  原子性:构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行.  稳定性:数据库在事 ...

  6. 关于a标签颜色的探索

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. SSH远程登录密码尝试

    import threading #创建一个登陆日志,记录登陆信息 paramiko.util.log_to_file('paramiko.log') client = paramiko.SSHCli ...

  8. python学习中的一些“坑”

    一.交互列表元素时,需要注意的坑. 例如: array=[4,5,9,8,10,8,4,0,3,4]  最大的值与第一个元素交换,最小的值与最后一个元素交换 # -*- coding: UTF-8 - ...

  9. centos 命令

    1.查看占用端口的进程 netstat -lnp|grep 3000(3000为端口号) Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statis ...

  10. C# .net中json字符串和对象之间的转化方法

    http://blog.csdn.net/xuexiaodong009/article/details/46998069 json作为作为一种最常用的数据,应用很广泛,在.net中如何把一个对象转化为 ...