摘抄自:ABS_CN

  

  当要引用一个变量的值时,一般推荐使用双引号。使用双引号除了变量名[2]前缀($)、后引符(`)和转义符(\)外,会使shell不再解释引号中其它所有的特殊字符。[3] 用双引号时$仍被当成特殊字符,允许引用一个被双引号引起的变量("$variable"), 那也是说$variable会被它的值所代替。

用双引号还能使句子不被分割开. [4] 一个参数用双引号引起来能使它被看做一个单元,这样即使参数里面包含有空白字符也不会被shell分割开了。

   1 variable1="a variable containing five words"
2 COMMAND This is $variable1 # 用下面7个参数执行COMMAND命令:
3 # "This" "is" "a" "variable" "containing" "five" "words"

5 COMMAND "This is $variable1" # 用下面1个参数执行COMMAND命令:
6 # "This is a variable containing five words"


9 variable2="" # 空字符串。
10 
11 COMMAND $variable2 $variable2 $variable2 # 没有带参数执行COMMAND 命令
12 COMMAND "$variable2" "$variable2" "$variable2" # 用三个含空字符串的参数执行COMMAND命令
13 COMMAND "$variable2 $variable2 $variable2" # 用一个包含两个空白符的参数执行COMMAND命令
14 
15 # Thanks, St閜hane Chazelas.

在echo语句中,只有句子分割和保存空白符的时候,才需要把参数用双引号引起来。.


例子 5-1. 引号引起奇怪的变量

   1 #!/bin/bash
2 # weirdvars.sh: Echoing weird variables.

4 var="'(]\\{}\$\""
5 echo $var # '(]\{}$"
6 echo "$var" # '(]\{}$" 和上面一句没什么不同.

8 echo

10 IFS='\'
11 echo $var # '(] {}$" \字符被空白符替换了,为什么?
12 echo "$var" # '(]\{}$"
13 
14 # 以上例子由Stephane Chazelas提供..
15 
16 exit 0

单引号(' ')和双引号类似,但它不允许解释变量引用,因此,在单引号内的字符$的特殊意思无效了。在单引号内,除了字符',每个特殊字符都只是字面的意思。单引号(全局引用)比双引号(部分引用)更严格的处理引用部分。

由于在单引号里的转义字符(\)也只是被局限于字面上的意思,所以想在一双单引号里再加单引号是不行的。

   1 echo "Why can't I write 's between single quotes"

3 echo

5 # The roundabout method.
6 echo 'Why can'\''t I write '"'"'s between single quotes'
7 # |-------| |----------| |-----------------------|
8 # 三个单引号引起的字符串之间有一个转义的单引号和一个由双引号引起的单引号.

10 # 这个例子得到 St閜hane Chazelas同意.

注:

[1]

除非当前目录下有一个文件名为first的文件。那这是引用的另外一个不同的理由了。(多谢 Harald Koenig指出这一点)

[2]

这也会使变量的值会有副作用。(看下面的)

[3]

在命令行上,把感叹号"!"放在双引号里执行命令会出错(译者注:比如说:echo "hello!"). 因为感叹号被解释成了一个历史命令. 然而在一个脚本文件里,这么写则是正确的,因为在脚本文件里Bash的历史机制被禁用了。

在双号号里在字符"\"也会引起许多不一致的行为。

 bash$ echo hello\!
hello! bash$ echo "hello\!"
hello\! bash$ echo -e x\ty
xty bash$ echo -e "x\ty"
x y

(多谢Wayne Pollock指出这一点)

[4]

句子的分割,在这里是指分割一个字符串为许多不连续的单独的参数。

PS:

使用单引号可以阻止shell解释器编辑指令中的特殊字符或空格(shell使用空格决定提交给程序的独立的参数,特殊的shell字符在调用之前被展开)

Have a nice day!!!

一、单引号和双引号

首先,单引号和双引号,都是为了解决中间有空格的问题。

因为空格在linux中时作为一个很典型的分隔符,比如string1=this is astring,这样执行就会报错。为了避免这个问题,因此就产生了单引号和双引号。他们的区别在于,单引号将剥夺其中的所有字符的特殊含义,而双引号中的'$'(参数替换)和'`'(命令替换)是例外。所以,两者基本上没有什么区别,除非在内容中遇到了参数替换符$和命令替换符`。

所以下面的结果:
num=3
echo ‘$num’
$num
echo “$num”
3
所以,如果需要在双引号””里面使用这两种符号,需要用反斜杠转义。

二、反引号``

这个东西的用法,我百度了一下,和$()是一样的。在执行一条命令时,会先将其中的 ``,或者是$() 中的语句当作命令执行一遍,再将结果加入到原命令中重新执行,例如:
echo `ls`
会先执行 ls 得到xx.sh等,再替换原命令为:
echo xx.sh
最后执行结果为
xx.sh
那么,平时我们遇到的把一堆命令的执行结果输出到一个变量中,需要用这个命令替换符括起来,也就可以理解了。
这里又涉及到了一个问题,虽然不少系统工程师在使用替换功能时,喜欢使用反引号将命令括起来。但是根据POSIX规范,要求系统工程师采用的是$(命令)的形式。所以,我们最好还是遵循这个规范,少用``,多用$()

三、小括号,中括号,和大括号的区别

那么,下面又涉及到了一个问题,就是小括号,中括号,和大括号的区别。
先说说小括号和大括号的区别。这两者,实际上是“命令群组”的概念,也就是commandgroup。
( ) 把 command group 放在subshell去执行,也叫做 nested sub-shell。
{ } 则是在同一个 shell 內完成,也称为 non-namedcommand group。
所以说,如果在shell里面执行“函数”,需要用到{},实际上也就是一个命令群组么。
不过,根据实测,test=$(ls -a)可以执行,但是test=${ls–a}语法上面是有错误的。估计也和上面所说的原因有关。

另外,从网上摘录的区别如下:
A,()只是对一串命令重新开一个子shell进行执行
B,{}对一串命令在当前shell执行
C,()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
D,()最后一个命令可以不用分号
E,{}最后一个命令要用分号
F,{}的第一个命令和左括号之间必须要有一个空格
G,()里的各命令不必和括号有空格
H,()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

两个括号(()),是代表算数扩展,就是对其包括的东西进行标准的算数计算——注意,不能算浮点数,如果需要算浮点数,需要用bc做。

至于中括号[],感觉作用就是用来比较的。比如放在if语句里面,while语句里面,等等。
这里引出来[..]和[[…]]的区别:(摘自网上,实测证实):使用[[... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误.比如,&&, ||, <,和> 操作符能够正常存在于[[ ]]条件判断结构中, 但是如果出现在[ ]结构中的话,会报错。

linux bash shell 中的单引号和双引号的更多相关文章

  1. linux bash shell中,单引号、 双引号,反引号(``)的区别及各种括号的区别

    一.单引号和双引号 首先,单引号和双引号,都是为了解决中间有空格的问题. 因为空格在Linux中时作为一个很典型的分隔符,比如string1=this is astring,这样执行就会报错.为了避免 ...

  2. linux shell中的单引号与双引号的区别(看完就不会有引号的疑问了)(转)

    tips: ============================= IFS - LINUX字段分隔符,内部字段分隔符 IFS(Internal Field Seperator)在Linux的she ...

  3. linux shell中,单引号、 双引号,反引号(``),$()的区别

    一.单引号和双引号 首先,单引号和双引号,都是为了解决中间有空格的问题. 空格在linux中时作为一个很典型的分隔符,比如 string1=this is a string,这样执行会报错.为了避免这 ...

  4. Linux下Shell脚本字符串单引号、双引号、反引号、反斜杠的作用和区别

    一.单引号 str='this is a string' 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单引号(对单引号使用转义符后也不行) ...

  5. javaScript中的单引号与双引号

    javaScript中的单引号与双引号没有什么区别.但因为xhtml规范要求所有xhtml属性要用双引号括起来.所以在javaScript中使用单引号. var html = '<h2 clas ...

  6. js、html中的单引号、双引号及其转义使用

    js.html中的单引号.双引号及其转义使用在js中对相关字符做判断或取值的时候很多情况下都会用到这些. ------ 在一个网页中的按钮,写onclick事件的处理代码,不小心写成如下:<in ...

  7. JS 和 HTML 中的单引号与双引号

    JS中的单引号与双引号 HTML中的单引号与双引号很简单,就是两个字符实体: 显示 描述 实体名称 实体编号 " 双引号.引号 " " ' 单引号.撇号 &apo ...

  8. shell脚本中:单引号和双引号的区别

    单引号和双引号的区别 前面我们还留下一个疑问,定义变量时,变量的值可以由单引号' '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明: #!/bin ...

  9. linux 中的单引号 和双引号有什么区别吗

    单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符 ,而不会有特殊符号.我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个 ...

  10. php中的单引号、双引号和转义字符

    PHP单引号及双引号均可以修饰字符串类型的数据,如果修饰的字符串中含有变量(例$name):最大的区别是: 双引号会替换变量的值,而单引号会把它当做字符串输出. 例如: <?php        ...

随机推荐

  1. 【YashanDB知识库】自关联外键插入数据时报错:YAS-02033 foreign key constraint violated parent key not found

    问题现象 使用如下的sql语句创建自关联外键表: drop table self_f_key; create table self_f_key(t1 number primary key not nu ...

  2. 苹果(ios)打包证书下载

    这里,首先需要明确的是,苹果打包证书不能共用,因此证书下载是只能下载自己的证书,不是去下载别人的证书. 那么自己的证书又是如何生成的呢?去什么地方下载呢?第一次开发ios的同学们,肯定会问这个问题. ...

  3. Angular 18+ 高级教程 – Signals

    前言 首先,我必须先说明清楚.Signal 目前不是 Angular 的必备知识. 你的项目不使用 Signal 也不会少了条腿,断了胳膊. Angular 官方维护的 UI 组件库 Angular ...

  4. Azure Computer Vision 之 Smart Crop 智能裁剪图片

    前言 一个网站通常有许多地方会用到同一张图,但是比例又不一样. 一般的做法就是用 CSS 的 cover 和 contain 来处理. 由于 cover 只会保留中间信息, 所以很多时候需要人工裁剪. ...

  5. SQL Server – 冷知识 (新手)

    前言 没有系统化学一本语言或技术, 那便会被一些冷知识坑. 这里做些记入. 变量作用域 SQL 是远古语法, 声明变量在最顶部就是一条上古法则. 如果我看见有了用这个法则写 C# 或 JS 我就会杀了 ...

  6. 【赵渝强老师】第一个Oracle的手工备份和恢复

    一.什么是手工管理的备份与恢复? 尽管在Oracle中,已经有了RMAN的备份与恢复.但是作为Oracle备份恢复的一种方式,我们将在本文中通过一个例子来为大家介绍如何使用手工的方式来完成Oracle ...

  7. c++可变模板参数

    在C++中的可变模板参数使用省略号 ... 来表示一个参数包(Parameter Pack),其具体位置决定了这个包是模板参数包还是函数参数包,以及如何进行参数展开. 1. 模板参数包:c... Ar ...

  8. 什么是 DOM

    百度: DOM 定义:文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口.它是一种与平台和语言无关的应用程序接口(API),它可 ...

  9. ADO.NET组成

    SqlConnection(数据库连接器) SqlCommand(数据库命名对象) SqlCommandBuilder(生存SQL命令) SqlDataReader(数据读取器) SqlDataAda ...

  10. kotlin更多语言结构——>选择加入要求

    1.3.70 中引入了 @RequireOptIn 与 @OptIn 注解以取代先前使用的 @Experimental 与 @UseExperimental;同时 -Xopt-in 编译器选项也取代了 ...