当前位置:首页 > 技术分析 > 正文内容

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

ruisui882个月前 (04-26)技术分析22

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

单引号

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

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

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

双引号

双引号类似于单引号,只是它允许 shell 解释美元符号 ( $ )、反引号 ( ` )、反斜杠 ( \ ) 和感叹号 ( ! ), 这些字符与双引号一起使用时具有特殊含义,并且在显示之前对其进行评估

双引号可以通过在双引号前加上反斜杠来使用其自身

实例

下面通过几个实例来说明 单引号 和 双引号之间的一些区别

  • 实例1

新建 shell 脚本 t1.sh ,内容如下

#!/bin/bash

a=98
echo "$a"
echo '$a'

执行 ./t1.sh 命令,结果如下

[root@localhost quotes_test]# ./t1.sh 
98
$a

从结果可以看出,双引号中的 $a 被解释为变量 a 的值

但是单引号中的 $a 只是原样输出,单引号不会解释其中的 $ 以及 a 字符

  • 实例2

双引号中的 \\n 会被转义成换行符\n,但在单引号内,\n 被当成普通字符与同一行的其他字符一起显示

  • 实例3

新建 shell 脚本 t2.sh, 内容如下

#!/bin/bash

ary[0]=8
echo "${ary[0]}"
echo '${ary[0]}'

执行脚本,结果如下

[root@localhost quotes_test]# ./t2.sh 
8
${ary[0]}

从结果可以看出,当 ${ary[0]} 用双引号括起来时,表示数组的第一个元素,所以输出 8

但是,被单引号括起来时,被当做单纯的字符输出,并不会解释为数组的第一个元素

  • 实例4

新建 shell 脚本 t3.sh, 内容如下

#!/bin/bash

a=45
echo "'$a'"
echo '"$a"'

执行脚本,结果如下

[root@localhost quotes_test]# ./t3.sh 
'45'
"$a"

由上面的结果可知,单引号在双引号内没有特殊的含义,因此,即使 $a 在单引号内,也还是会解释成 45

但是,当双引号在单引号内时,即使 $a 位于双引号内,也不会对变量 a 求值, 还是按照普通字符输出

  • 实例5

新建 shell 脚本 t4.sh, 内容如下

#!/bin/bash

a=" $(printf hello) "  # 相当于 " `printf hello` "
b=' $(printf hello) '  # 相当于 ' `printf 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 脚本过程中,就不会在单双引号上出错了

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3615.html

分享给朋友:

“终于知道 Shell 中单引号双引号的区别了” 的相关文章

「2022」打算跳槽涨薪,必问面试题及答案——VUE篇

1、为什么选择VUE,解决了什么问题?vue.js 正如官网所说的,是一套构建用户界面的渐进式框架。与其它重量级框架不同的是,vue 被设计为可以自底向上逐层应用。vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另外一方面,当与现代化工具链以及各种支持类库结合使用时,vu...

vue中组件之间的通信方式

** 1.1 父子组件**a. 父向子传数据: 第1种: 父通过属性传值,子组件通过props接收数据(注:props传过来的数据是单向的,不可以进行修改)第2种:子组件可以通过$parent来获取父组件里的数据和调用父组件的方法(注:数据是双向的,还要注意如用了UI组件并且在该UI组件里重新定义一...

gitlab简单搭建与应用

一、gitlab1、简介GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。与Github类似,GitLab能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历...

BuildKit 镜像构建工具

#暑期创作大赛#快速开始 对于 Kubernetes 部署,请参阅examples/kubernetes。BuildKit 由buildkitd守护进程和buildctl客户端组成。虽然buildctl客户端可用于 Linux、macOS 和 Windows,但buildkitd守护程序目前仅适用于...

多项修正 尼康D4s发布最新1.10版固件

尼康公司与2014年8月27日发布了D4s的最新固件,固件版本号为C:1.10。这次固件升级,主要解决了一些BUG,并且对拍摄菜单与相机操作做了一定调整。下面是本次新固件的具体信息:尼康发布D4s最新C固件 1.10版对C固件升级到1.10版所作的修改:当选定运动VR模式并换上 AF-S 尼克尔 4...

《暗黑破坏神 2:重制版》PC 版 2.3 版本发布,支持英伟达 DLSS

IT之家 12 月 3 日消息,暴雪为《暗黑破坏神 2:重制版》PC 版发布了更新 2.3 版本,添加了“离线难度缩放”滑块(玩家可以在单人游戏时增加挑战和奖励的级别)、多项辅助功能和用户界面改进,以及英伟达 DLSS 支持。玩法改进:玩家现在可以在离线游戏的选项菜单中使用“游戏难度等级”,它提供与...