设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 数据 创业者 手机
当前位置: 首页 > 服务器 > 系统 > 正文

Bash Shell 中单引号和双引号的差异

发布时间:2022-11-23 10:12 所属栏目:52 来源:互联网
导读:
导读:我们在 Linux 命令中经常会用到引号,比如处理文件名中的空格,或者处理特殊字符的时候。 本文将介绍不同类型的引号及其在 shell 脚本中的用法。 总结一下,大概有四种类型的引号: 单引号: 双引号: 反斜杠:\ 反引号:` 除了反斜杠以外,其余三个都是成对
  我们在 Linux 命令中经常会用到引号,比如处理文件名中的空格,或者处理特殊字符的时候。
 
  本文将介绍不同类型的引号及其在 shell 脚本中的用法。
 
  总结一下,大概有四种类型的引号:
 
  单引号:'
  双引号:"
  反斜杠:\
  反引号:`
  除了反斜杠以外,其余三个都是成对出现。下面我们来详细看一下。
 
  1.单引号
  shell 会忽略单引号中所有的特殊字符,其中的所有内容都会被当作一个元素。
 
  我们举个例子,假如有一个文本文件,里面记录了一些人名,如下:
 
  复制
  $ cat cricket
  Allan Donald, South Africa
  Steve Waugh, Australia
  Mark Waugh, Australia
  Henry Olonga, Zimbabwe
  Sachin Tendulkar, India
  1.
  2.
  3.
  4.
  5.
  6.
  现在我们使用 grep 命令在其中搜索 "Waugh",会得到两个结果:
 
  复制
  $ grep Waugh cricket
  Steve Waugh, Australia
  Mark Waugh, Australia
  1.
  2.
  3.
  但是如果我们更精确一点,搜索 Steve Waugh,就会出现错误:
 
  复制
  $ grep Steve Waugh cricket
  grep: Waugh: No such file or directory
  cricket:Steve Waugh, Australia
  1.
  2.
  3.
  为什么会这样呢?因为空格在命令行中用于分割命令、选项和参数。在上面的例子中,我们原本是要搜索 Steve Waugh,但 shell 会将 Steve 作为 grep 的第一个参数,然后将 Waugh 和 cricket 作为被搜索的文件,很显然,没有 Waugh 这个文件,所以就报错了。同时,输出中显示了文件 cricket 的结果。
 
  如果我们使用单引号,来搜索 'Steve Waugh',它会被视为一个整体,那这样就得到了我们期望的搜索结果:
 
  复制
  $ grep 'Steve Waugh' cricket
  Steve Waugh, Australia
  1.
  2.
  基本上,当shell看到第一个单引号时,它会忽略任何特殊字符(空格也是一个特殊字符),直到找到另一个单引号(右引号)。
 
  忽略所有特殊字符
 
  如果用单引号引起来,所有特殊字符都会失去其原本的意义。下面我们举几个例子。
 
  我们在shell中声明一个变量,如果用$回显变量名,它将显示变量的值:
 
  复制
  $ var=my_variable
  $ echo $var
  my_variable
  1.
  2.
  3.
  但如果用单引号引起来,$ 将失去其特殊的功能。
 
  复制
  $ echo '$var'
  $var
  1.
  2.
  另一个例子,回车键(回车字符)也放在单引号里面:
 
  复制
  $ echo 'how are
  you?'
  how are
  you?
  1.
  2.
  3.
  4.
  2.双引号
  双引号几乎与单引号相似。这里之所以说“几乎”是因为他们也会忽略所有特殊字符,除了:
 
  美元符号:$
  反引号:`
  反斜杠:\
  由于美元符号 $ 不会被忽略,所以我们可以使用变量名,得到变量的值;但是单引号就不能这样:
 
  复制
  $ var=my_variable
  $ echo " echo 'var
  1.
  2.
  双引号还可用于在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
  1.
  2.
  3.
  4.
  5.
  反过来用(用单引号转义双引号),也可以:
 
  复制
  $ var=he said, "Awesome!"
  said,: command not found
  $ var='he said, "Awesome!"'
  $ echo $var
  he said, "Awesome!"
  1.
  2.
  3.
  4.
  5.
  3.反斜杠
  反斜杠用于转义特殊字符。看下面的例子:
 
  复制
  $ var=variable
  $ echo \var
  var
  $ echo $var
  variable
  $ echo \$var
  $vara
  1.
  2.
  3.
  4.
  5.
  6.
  7.
  因为 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
  1.
  现在我们使用反斜杠,将上述命令分解为多行:
 
  复制
  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
  1.
  2.
  所以,反引号已经不再使用了。
 
  以上就是本次分享全部内容,欢迎讨论。

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读