服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - Bash Shell 中单引号和双引号的区别

Bash Shell 中单引号和双引号的区别

2022-11-16 21:06TIAP刘光录 Linux

我们在 Linux 命令中经常会用到引号,比如处理文件名中的空格,或者处理特殊字符的时候。本文将介绍不同类型的引号及其在 shell 脚本中的用法。

Bash Shell 中单引号和双引号的区别

我们在 Linux 命令中经常会用到引号,比如处理文件名中的空格,或者处理特殊字符的时候。

本文将介绍不同类型的引号及其在 shell 脚本中的用法。

总结一下,大概有四种类型的引号:

  • 单引号:'
  • 双引号:"
  • 反斜杠:\
  • 反引号:`

除了反斜杠以外,其余三个都是成对出现。下面我们来详细看一下。

1.单引号

shell 会忽略单引号中所有的特殊字符,其中的所有内容都会被当作一个元素。

我们举个例子,假如有一个文本文件,里面记录了一些人名,如下:

$ cat cricket
Allan Donald, South Africa
Steve Waugh, Australia
Mark Waugh, Australia
Henry Olonga, Zimbabwe
Sachin Tendulkar, India

现在我们使用 grep 命令在其中搜索 "Waugh",会得到两个结果:

$ grep Waugh cricket
Steve Waugh, Australia
Mark Waugh, Australia

但是如果我们更精确一点,搜索 Steve Waugh,就会出现错误:

$ grep Steve Waugh cricket grep: Waugh: No such file or directory
cricket:Steve Waugh, Australia

为什么会这样呢?因为空格在命令行中用于分割命令、选项和参数。在上面的例子中,我们原本是要搜索 Steve Waugh,但 shell 会将 Steve 作为 grep 的第一个参数,然后将 Waugh 和 cricket 作为被搜索的文件,很显然,没有 Waugh 这个文件,所以就报错了。同时,输出中显示了文件 cricket 的结果。

如果我们使用单引号,来搜索 'Steve Waugh',它会被视为一个整体,那这样就得到了我们期望的搜索结果:

$ grep 'Steve Waugh' cricket
Steve Waugh, Australia

基本上,当shell看到第一个单引号时,它会忽略任何特殊字符(空格也是一个特殊字符),直到找到另一个单引号(右引号)。

忽略所有特殊字符

如果用单引号引起来,所有特殊字符都会失去其原本的意义。下面我们举几个例子。

我们在shell中声明一个变量,如果用$回显变量名,它将显示变量的值:

$ var=my_variable $ echo $var my_variable

但如果用单引号引起来,$ 将失去其特殊的功能。

$ echo '$var' $var

另一个例子,回车键(回车字符)也放在单引号里面:

$ echo 'how are you?' how are
you?

2.双引号

双引号几乎与单引号相似。这里之所以说“几乎”是因为他们也会忽略所有特殊字符,除了:

  • 美元符号:$
  • 反引号:`
  • 反斜杠:\

由于美元符号 $ 不会被忽略,所以我们可以使用变量名,得到变量的值;但是单引号就不能这样:

$ var=my_variable $ echo " echo 'var

双引号还可用于在shell中转义单引号(即将其转义为普通字符):

$ var=My 'own villa' is yellow
own villa: command not found $ var="My 'own villa' is yellow" $ echo $var My 'own villa' is yellow

反过来用(用单引号转义双引号),也可以:

$ var=he said, "Awesome!" said,: command not found $ var='he said, "Awesome!"' $ echo $var he said, "Awesome!"

3.反斜杠

反斜杠用于转义特殊字符。看下面的例子:

$ var=variable $ echo \var
var $ echo $var variable $ echo \$var $vara

因为 v 没有什么特别的含义,echo \var 只是简单的打印了 var。另一方面,当使用 $var 的时候,反斜杠转义了 $ 符号,所以打印出了 $var。

用反斜杠转义换行符

我们可以使用反斜杠来转义换行符,这样就可以将单个命令换行继续编写。

当命令太长或是多个命令的组合时,你会看到一些网站使用反斜杠在多行中显示单个命令。这可以使命令或代码更具可读性。

看下面的例子:

docker run --name server --network net -v html:/usr/share/nginx/html -v $PWD/custom-config.conf:/etc/nginx/nginx.conf -p 80:80 --restart on-failure -d nginx:latest

现在我们使用反斜杠,将上述命令分解为多行:

docker run --name server --network net \ -v html:/usr/share/nginx/html \ -v $PWD/custom-config.conf:/etc/nginx/nginx.conf \ -p 80:80 --restart on-failure -d nginx:latest

这样看起来容易多了。

双引号内的反斜杠

在双引号内,/ (反斜杠)、$ (美元符号)以及 ` (反引号)是不被转义的三个符号。

这样的话,我们就可以使用反斜杠来转义双引号中的美元符号、双引号以及反引号了。

看下面的例子,其中的 $5 会被认为是一个未声明的变量,且没有被赋值,所以在 echo 命令中会将其忽略:

$ echo "Meal costs $5.25" Meal costs .25

要避免上述情况,可以使用 \ 来转义 $

$ echo "Meal costs \$5.25" Meal costs $5.25

4.反引号

反引号( ` )有一个特殊含义,用于命令替换。

Shell 具有此命令替换功能,其中指定的命令将替换为命令的输出。

在下面的例子中,

date 会被替换为 date 命令的输出信息,即系统的当前日期和时间而输出:

$ echo The current date and time is date
The current date and time is Monday 23 August 2021 04:55:18 PM IST

需要注意的一点是,只有当反引号之间是一个命令的时候,才会进行替换,否则,将会按原内容显示:

$ echo 'The current date and time is late' The current date and time is late

如前文所述,将反引号放在双引号中,不会被转义,但是放在单引号中,会被转义为普通字符。

反引号不在建议使用

很长时间以来,反引号都用于 Shell 脚本中的命令替换,但是现在,现代 Unix 和 Linux 系统更提倡使用 $(command) 结构,比如:

$ echo The current date and time is $(date) The current date and time is Monday 23 August 2021 05:55:47 PM IST

所以,反引号已经不再使用了。

以上就是本次分享全部内容,欢迎讨论。

原文地址:https://mp.weixin.qq.com/s?__biz=MzI0OTQyNjU5Mw==&mid=2247484629&idx=1&sn=c9f098b157875ba46d03b513cbee82b7

延伸 · 阅读

精彩推荐
  • LinuxLinux ifconfig命令详解和使用示例(Linux网络参数配置和查看)

    Linux ifconfig命令详解和使用示例(Linux网络参数配置和查看)

    许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改。Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config) ...

    Linux教程网3482019-11-16
  • Linuxlinux Apache CGI 安装配置

    linux Apache CGI 安装配置

    Apache 中的提交了一种利用扩展应用程序执行动态网页的机制. 称为Common Gateway Interface (通用网关接口)简称CGI....

    Linux教程网6322021-08-25
  • Linuxlinux系统命令大全使用详解(大全)

    linux系统命令大全使用详解(大全)

    变换工作目录至 dirName。 其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的 home directory (也就是刚 login 时所在的目录).另外...

    linux命令大全6682019-12-29
  • LinuxLinux系统如何使用iptables进行本地端口转发?

    Linux系统如何使用iptables进行本地端口转发?

    这篇文章主要为大家介绍了如何使用iptables进行本地端口转发,在工作环境中接触到iptables有时候需要进行端口转发功能,例如我本机不开放那些端口的,但...

    Linux技术网7322019-10-23
  • LinuxLinux系统下怎么创建和管理逻辑卷?

    Linux系统下怎么创建和管理逻辑卷?

    Linux系统下怎么创建和管理逻辑卷?逻辑卷可以动态调整磁盘容量,从而提高磁盘管理的灵活性,本次主要讲解的是逻辑卷(LVM)的创建,LVM逻辑卷的创建...

    脚本之家6212019-10-12
  • Linux实例讲解Linux中cd命令切换目录的使用技巧

    实例讲解Linux中cd命令切换目录的使用技巧

    这篇文章主要介绍了Linux中cd命令切换目录的使用技巧,cd命令的用法是Linux入门学习中的基础知识,需要的朋友可以参考下...

    GitHub3602019-06-16
  • Linux在Linux系统中安装使用WPS的方法

    在Linux系统中安装使用WPS的方法

    这篇文章主要介绍了在Linux系统中安装使用WPS的方法,在Linux上缺少微软的office的情况下,WPS实为办公文件处理的不二选择,需要的朋友可以参考下 ...

    开源中文社区12802019-09-30
  • LinuxMac中文件权限查看和设置详解

    Mac中文件权限查看和设置详解

    这篇文章主要给大家介绍了关于Mac系统下文件权限查看和设置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Mac具有一定的参考学...

    Frank Fan''''s Blog4862022-08-18