终于知道 Shell 中单引号双引号的区别了

终于知道 Shell 中单引号双引号的区别了

在编写 shell 脚本或输入命令时,你可能已经注意到大多数命令都可以使用单引号 或双引号, 这不仅适用于 shell 脚本,而且适用于所有 Bash 命令, 但是两种类型的引号以及 Bash shell 解释它的方式之间存在一定的差异,下面将介绍它们之间的不同

单引号

用单引号 ‘ ‘ 括起来的字符会保留引号内每个字符的字面值

简而言之,shell 将逐字解释单引号内的封闭文本,并且不会插入任何内容,包括变量、反引号、某些 ** 转义符等

单引号中的任何字符都没有特殊含义, 当你不想使用转义字符来更改 shell 脚本解释输入字符串参数方式时,就会很方便

双引号

双引号类似于单引号,只是它允许 shell 解释美元符号 ( $ )、反引号 ( </strong> )、反斜杠 ( \ ) 和感叹号 ( ! ), 这些字符与双引号一起使用时具有特殊含义,并且在显示之前对其进行评估</p> <p>双引号可以通过在双引号前加上反斜杠来使用其自身</p> <h3>实例</h3> <p>下面通过几个实例来说明 单引号 和 双引号之间的一些区别</p> <ul> <li>实例1</li> </ul> <p>新建 shell 脚本 <code>t1.sh</code> ,内容如下</p> <pre><code>#!/bin/bash a=98 echo "$a" echo '$a' </code></pre> <p>执行 <code>./t1.sh</code> 命令,结果如下</p> <pre><code>[root@localhost quotes_test]# ./t1.sh 98 $a </code></pre> <p>从结果可以看出,双引号中的 <strong>$a</strong> 被解释为变量 <strong>a</strong> 的值</p> <p>但是单引号中的 <strong>$a</strong> 只是原样输出,单引号不会解释其中的 <strong>$</strong> 以及 <strong>a</strong> 字符</p> <ul> <li>实例2</li> </ul> <p><img alt="" src="https://pic.imgdb.cn/item/61653d932ab3f51d91e118a8.png" /></p> <p>双引号中的 <strong>\n</strong> 会被转义成换行符 <strong>\n</strong>,但在单引号内, <strong>\n</strong> 被当成普通字符与同一行的其他字符一起显示</p> <ul> <li>实例3</li> </ul> <p>新建 shell 脚本 <code>t2.sh</code>, 内容如下</p> <pre><code>#!/bin/bash ary[0]=8 echo "${ary[0]}" echo '${ary[0]}' </code></pre> <p>执行脚本,结果如下</p> <pre><code>[root@localhost quotes_test]# ./t2.sh 8 ${ary[0]} </code></pre> <p>从结果可以看出,当 ${ary[0]} 用双引号括起来时,表示数组的第一个元素,所以输出 <code>8</code></p> <p>但是,被单引号括起来时,被当做单纯的字符输出,并不会解释为数组的第一个元素</p> <ul> <li>实例4</li> </ul> <p>新建 shell 脚本 <code>t3.sh</code>, 内容如下</p> <pre><code>#!/bin/bash a=45 echo "'$a'" echo '"$a"' </code></pre> <p>执行脚本,结果如下</p> <pre><code>[root@localhost quotes_test]# ./t3.sh '45' "$a" </code></pre> <p>由上面的结果可知,单引号在双引号内没有特殊的含义,因此,即使 <strong>$a</strong> 在单引号内,也还是会解释成 <code>45</code></p> <p>但是,当双引号在单引号内时,即使 <strong>$a</strong> 位于双引号内,也不会对变量 <strong>a</strong> 求值, 还是按照普通字符输出</p> <ul> <li>实例5</li> </ul> <p>新建 shell 脚本 <code>t4.sh</code>, 内容如下</p> <pre><code>#!/bin/bash a=" $(printf hello) " # 相当于 " hello " b=' $(printf hello) ' # 相当于 ' hello` ‘
echo $a
echo $b

执行脚本,结果如下

[root@localhost quotes_test]# ./t4.sh
hello
$(printf hello)

从结果可以知道,双引号中的 $(printf hello) 会被解释成 printf hello 命令,执行 echo $a 命令相当于执行了 printf hello , 结果输出 hello

单引号中的 $(printf hello) ,只是表示普通字符而已,所以 echo $b 命令的结果是 $(printf hello) 字符的原样输出

小结

本文介绍了 shell 中单引号和双引号的区别,主要是通过实例的方式来展示他们之间的不同点,熟悉了它们的不同点后,在编写 shell 脚本过程中,就不会在单双引号上出错了

Original: https://www.cnblogs.com/wanng/p/shell-double-quotes.html
Author: Linux开发那些事儿
Title: 终于知道 Shell 中单引号双引号的区别了

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607471/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 灵感来袭,基于Redis的分布式延迟队列

    延迟队列 延迟队列,也就是一定时间之后将消息体放入队列,然后消费者才能正常消费。比如1分钟之后发送短信,发送邮件,检测数据状态等。 Redisson Delayed Queue 如…

    Linux 2023年5月28日
    094
  • Mysql数据库语言学习的路线

    对于我们数据库的学习,不管是测试人员还是开发人员以及我们的DBA来说重点都是SQL;但是我们的SQL可以分多少类型,学习重点又是在哪里呢,本文仅仅针对测试人员来展开说明: SQL:…

    Linux 2023年6月14日
    095
  • Redis基础教程

    redis基础教程 1、 string数据结构 a) SET server:name “fido” b) SETNX server:name1″…

    Linux 2023年5月28日
    091
  • MySQL之视图、触发器、事务、索引及其他知识补充

    一、视图 视图是将SQL语句的查询结果当做虚拟表实体化保存起来,以后可以反复使用 create view teacher2course as select * from teach…

    Linux 2023年6月14日
    0106
  • CentOS7.6下安装Redis5.0.7

    此次安装是在CentOS7下安装Redis5.0.7 &#x8FD9;&#x91CC;&#x4E0B;&#x8F7D;&#x7684;&am…

    Linux 2023年6月14日
    0118
  • redisson中的看门狗机制总结

    1:普通的Redis分布式锁的缺陷我们在网上看到的redis分布式锁的工具方法,大都满足互斥、防止死锁的特性,有些工具方法会满足可重入特性。如果只满足上述3种特性会有哪些隐患呢?r…

    Linux 2023年5月28日
    0139
  • Docker常用命令

    配置相关 docker version 查看版本 docker ps 查看当前运行的container docker exec -it php-fpm bash 进入cantain…

    Linux 2023年6月13日
    089
  • mycat数据库集群系列之mycat读写分离安装配置

    最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考。本次系列终结大概包括以下内容:多数据库安装、mycat部署安…

    Linux 2023年6月14日
    0136
  • 大数据之Hadoop的HDFS存储优化—异构存储(冷热数据分离)

    异构存储主要解决,不同的数据,储存在不同类型的硬盘中,达到最佳性能的问题 1)存储类型 RAM_DISK:内存镜像文件系统 SSD:SSD固态硬盘 DISK:普通磁盘,在HDFS中…

    Linux 2023年6月8日
    096
  • Docker自定义镜像无容器日志输出

    Docker自定义镜像无容器日志输出 因工作环境需要,需自己定制一个python环境的镜像,但制作完之后, docker logs发现无日志输出,经文档查询原来需要将日志重定向到标…

    Linux 2023年6月8日
    096
  • Cause: java.lang.ClassNotFoundException: Cannot find class: Studen

    Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type…

    Linux 2023年6月7日
    0114
  • 解决关闭shell会话窗口则会发现ASP.NET Core应用也会被关闭问题

    统计了三种方法: 一、使用nohup命令即可 【最简单】 nohup dotnet xxxx.dll 【xxxx为应用名称】 一般会报:nohup: ignoring input …

    Linux 2023年6月8日
    0129
  • Linux 目录挂载服务

    Linux 服务器挂载文件目录通常有三种形式,手动挂载、自动挂载、Autofs 自动挂载,下面对这三个挂载做一下介绍,接受一下这三个区别以及使用场景: 准备服务器和客户端: ser…

    Linux 2023年6月6日
    0101
  • JDK/MYSQL/TOMCAT环境变量

    IDE:智能开发环境 SDK:软件开发工具包 JDK:Java开发工具包 JRE:Java运行环境 JAR:Java档案文件 API:应用程序接口 1.JAVA_HOME的变量名下…

    Linux 2023年6月7日
    076
  • ACP 知识点总结

    记录下学习ACP过程不断遇到的且需要记录的知识点: 在阿里云专有网络VPC创建之后,路由器也是随着VPC一起自动创建,所以不需要手动创建,这个时候需要继续创建交换机才能在交换机种创…

    Linux 2023年6月14日
    0102
  • Linux -查找功能

    Linux下有很多用于查询的命令,持续更新ing find命令 find用于查找指定目录下的文件 语法: find 【查找的位置】(选项) (参数) [filename] 常用选项…

    Linux 2023年5月27日
    0127
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球