精华内容
下载资源
问答
  • shell 中引号类型
    2021-05-16 12:01:01

    在编写shell脚本的时候经常会用到引号,有些时候却老是忘记单引号和双引号之间的区别,

    所以就整理一下供以后脑子不好使了的时候前来复习一下。首先说下他们的共同点: 好像就只有

    一个,就是它们都可以用来界定一个字符串,这个没什么好解释的,真正需要记住的是它们区别,

    所以经过整理后,它们的区别主要包括:

    1)、单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原

    封不动的使用,唯一需要注意的点是不允许引用自身;

    2)、双引号属于弱引用,它会对一些被引起来的字符进行特殊处理,主要包括以下情况:

    1:$加变量名可以取变量的值 ,比如:

    [root@localhost ~]# echo '$PWD'

    $PWD

    [root@localhost ~]# echo "$PWD"

    /root

    2:反引号和$()引起来的字符会被当做命令执行后替换原来的字符,比如:

    [root@localhost ~]# echo '$(echo hello world)'

    $(echo hello world)

    [root@localhost ~]# echo "$(echo hello world)"

    hello world

    [root@localhost ~]# echo '`echo hello world`'

    `echo hello world`

    [root@localhost ~]# echo "`echo hello world`"

    hello world

    3:当需要使用字符($  `  "  \)时必须进行转义,也就是在前面加\ ;

    [root@localhost ~]# echo '$ ` " \'

    $ ` " \

    [root@localhost ~]# echo "\$ \` \" \\"

    $ ` " \

    备注:/bin/sh -> bash,版本:4.2.46  (2016-06-21 14:21:46)

    作者:潘洪银

    地址:http://www.cnblogs.com/panhongyin

    (转)linux shell单引号、双引号及无引号区别

    原文:http://blog.csdn.net/woshizhangliang999/article/details/50132265 3.描述linux shell中单引号.双引号及不加引号的简单区 ...

    shell 单引号以及双引号

    #!/bin/bash a= echo '$a' echo "$a" your_name='runoob' str="Hello, I know you are \&qu ...

    linux shell 单引号 双引号 反引号的区别

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

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

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

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

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

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

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

    Linux Shell基础 单引号、双引号、反引号、小括号和大括号

    单引号和双引号 单引号和双引号用于变量值出现空格时将字符用引号括起来. 二者的主要区别在于, 被单引号括起来的字符都是普通字符,就算特殊字符也不再有特殊含义: 被双引号括起来的字符中,"$& ...

    shell中的括号(小括号,中括号,大括号)及单引号、 双引号,反引号(``)

    一.小括号,园括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...

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

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

    随机推荐

    YAML 模板文件语法

    YAML 模板文件语法 默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建. 其 ...

    2014 Super Training #6 A Alice and Bob --SG函数

    原题: ZOJ 3666 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3666 博弈问题. 题意:给你1~N个位置,N是最 ...

    android的消息处理有三个核心类:Looper,Handler和Message。

    android的消息处理机制(图+源码分析)——Looper,Handler,Message   作为 一名android程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设 ...

    C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)

    严格来说这篇文章算不上C++范围的,不过还是挂了点边,还是在自己的blog中记录一下吧. C++中使用指针是家常便饭了,也非常的好用,这也是我之所以喜欢C++的原因之一.但是在C#中就强调托管的概念了 ...

    用Django搭建个人博客—(2)

    今日任务: 1 blog的数据库模型定义 2 简单的注册登录功能的实现 项目的源文件已经推送到git@oschina.net. 所以,如果想要参阅源码的请移步 (Fork) http://git.os ...

    Java Listener中Spring接口注入的使用

    在项目中使用Spring通常使用他的依赖注入可以很好的处理,接口与实现类之间的耦合性,但是通常的应用场景中都是Service层和DAO层,或者web层的话, 也是与Strust2来整合,那么如何在Li ...

    HTTPS安全证书介绍

    IIS配置web SSL 安全证书Https访问 From : http://cao416451347ming.blog.163.com/blog/static/1154556162010217441 ...

    python opencv3 人脸识别的例子

    一个人脸识别的例子 程序中用到了公共数据集, 欢迎去我的git上下载源码,源码里带有数据集 git:https://github.com/linyi0604/Computer-Vision 脚本中一个 ...

    更多相关内容
  • shell可以识别4种不同类型的引字符号: 单引号字符' 双引号字符" 反斜杠字符 反引号字符`的区别,学习shell编程的朋友可以看下
  • shell中引号和转义

    千次阅读 2021-07-29 17:54:38
    shell中引号和转义 引号和转义 Bash 只有一种数据类型,就是字符串。不管用户输入什么数据,Bash 都视为字符串。因此,字符串相关的引号和转义,对 Bash 来说就非常重要。 转义# 某些字符在 Bash 里面有特殊...

    shell中的引号和转义

    引号和转义

    Bash 只有一种数据类型,就是字符串。不管用户输入什么数据,Bash 都视为字符串。因此,字符串相关的引号和转义,对 Bash 来说就非常重要。

    转义#

    某些字符在 Bash 里面有特殊含义(比如$&*)。

    $ echo $date
    
    $
    

    上面例子中,输出$date不会有任何结果,因为$是一个特殊字符。

    如果想要原样输出这些特殊字符,就必须在它们前面加上反斜杠,使其变成普通字符。这就叫做“转义”(escape)。

    $ echo \$date
    $date
    

    上面命令中,只有在特殊字符$前面加反斜杠,才能原样输出。

    反斜杠本身也是特殊字符,如果想要原样输出反斜杠,就需要对它自身转义,连续使用两个反斜线(\\)。

    $ echo \\
    \
    

    上面例子输出了反斜杠本身。

    反斜杠除了用于转义,还可以表示一些不可打印的字符。

    • \a:响铃
    • \b:退格
    • \n:换行
    • \r:回车
    • \t:制表符

    如果想要在命令行使用这些不可打印的字符,可以把它们放在引号里面,然后使用echo命令的-e参数。

    $ echo a\tb
    atb
    
    $ echo -e "a\tb"
    a        b
    

    上面例子中,命令行直接输出不可打印字符\t,Bash 不能正确解释。必须把它们放在引号之中,然后使用echo命令的-e参数。

    换行符是一个特殊字符,表示命令的结束,Bash 收到这个字符以后,就会对输入的命令进行解释执行。换行符前面加上反斜杠转义,就使得换行符变成一个普通字符,Bash 会将其当作空格处理,从而可以将一行命令写成多行。

    $ mv \
    /path/to/foo \
    /path/to/bar
    
    # 等同于
    $ mv /path/to/foo /path/to/bar
    

    上面例子中,如果一条命令过长,就可以在行尾使用反斜杠,将其改写成多行。这是常见的多行命令的写法。

    单引号#

    Bash 允许字符串放在单引号或双引号之中,加以引用。

    单引号用于保留字符的字面含义,各种特殊字符在单引号里面,都会变为普通字符,比如星号(*)、美元符号($)、反斜杠(\)等。

    $ echo '*'
    *
    
    $ echo '$USER'
    $USER
    
    $ echo '$((2+2))'
    $((2+2))
    
    $ echo '$(echo foo)'
    $(echo foo)
    

    上面命令中,单引号使得 Bash 扩展、变量引用、算术运算和子命令,都失效了。如果不使用单引号,它们都会被 Bash 自动扩展。

    由于反斜杠在单引号里面变成了普通字符,所以如果单引号之中,还要使用单引号,不能使用转义,需要在外层的单引号前面加上一个美元符号($),然后再对里层的单引号转义。

    # 不正确
    $ echo it's
    
    # 不正确
    $ echo 'it\'s'
    
    # 正确
    $ echo $'it\'s'
    

    不过,更合理的方法是改在双引号之中使用单引号。

    $ echo "it's"
    it's
    

    双引号#

    双引号比单引号宽松,大部分特殊字符在双引号里面,都会失去特殊含义,变成普通字符。

    $ echo "*"
    *
    

    上面例子中,通配符*是一个特殊字符,放在双引号之中,就变成了普通字符,会原样输出。这一点需要特别留意,这意味着,双引号里面不会进行文件名扩展。

    但是,三个特殊字符除外:美元符号($)、反引号(`)和反斜杠(\)。这三个字符在双引号之中,依然有特殊含义,会被 Bash 自动扩展。

    $ echo "$SHELL"
    /bin/bash
    
    $ echo "`date`"
    Mon Jan 27 13:33:18 CST 2020
    

    上面例子中,美元符号($)和反引号(`)在双引号中,都保持特殊含义。美元符号用来引用变量,反引号则是执行子命令。

    $ echo "I'd say: \"hello!\""
    I'd say: "hello!"
    
    $ echo "\\"
    \
    

    上面例子中,反斜杠在双引号之中保持特殊含义,用来转义。所以,可以使用反斜杠,在双引号之中插入双引号,或者插入反斜杠本身。

    换行符在双引号之中,会失去特殊含义,Bash 不再将其解释为命令的结束,只是作为普通的换行符。所以可以利用双引号,在命令行输入多行文本。

    $ echo "hello
    world"
    hello
    world
    

    上面命令中,Bash 正常情况下会将换行符解释为命令结束,但是换行符在双引号之中就失去了这种特殊作用,只用来换行,所以可以输入多行。echo命令会将换行符原样输出,显示的时候正常解释为换行。

    双引号的另一个常见的使用场合是,文件名包含空格。这时就必须使用双引号,将文件名放在里面。

    $ ls "two words.txt"
    

    上面命令中,two words.txt是一个包含空格的文件名,否则就会被 Bash 当作两个文件。

    双引号会原样保存多余的空格。

    $ echo "this is a     test"
    this is a     test
    

    双引号还有一个作用,就是保存原始命令的输出格式。

    # 单行输出
    $ echo $(cal)
    一月 2020 日 一 二 三 四 五 六 1 2 3 ... 31
    
    # 原始格式输出
    $ echo "$(cal)"
          一月 2020
    日 一 二 三 四 五 六
              1  2  3  4
     5  6  7  8  9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    

    上面例子中,如果$(cal)不放在双引号之中,echo就会将所有结果以单行输出,丢弃了所有原始的格式。

    Here 文档#

    Here 文档(here document)是一种输入多行字符串的方法,格式如下。

    << token
    text
    token
    

    它的格式分成开始标记(<< token)和结束标记(token)。开始标记是两个小于号 + Here 文档的名称,名称可以随意取,后面必须是一个换行符;结束标记是单独一行顶格写的 Here 文档名称,如果不是顶格,结束标记不起作用。两者之间就是多行字符串的内容。

    下面是一个通过 Here 文档输出 HTML 代码的例子。

    $ cat << _EOF_
    <html>
    <head>
        <title>
        The title of your page
        </title>
    </head>
    
    <body>
        Your page content goes here.
    </body>
    </html>
    _EOF_
    

    Here 文档内部会发生变量替换,同时支持反斜杠转义,但是不支持通配符扩展,双引号和单引号也失去语法作用,变成了普通字符。

    $ foo='hello world'
    $ cat << _example_
    $foo
    "$foo"
    '$foo'
    _example_
    
    hello world
    "hello world"
    'hello world'
    

    上面例子中,变量$foo发生了替换,但是双引号和单引号都原样输出了,表明它们已经失去了引用的功能。

    如果不希望发生变量替换,可以把 Here 文档的开始标记放在单引号之中。

    $ foo='hello world'
    $ cat << '_example_'
    $foo
    "$foo"
    '$foo'
    _example_
    
    $foo
    "$foo"
    '$foo'
    

    上面例子中,Here 文档的开始标记(_example_)放在单引号之中,导致变量替换失效了。

    Here 文档的本质是重定向,它将字符串重定向输出给某个命令,相当于包含了echo命令。

    $ command << token
      string
    token
    
    # 等同于
    
    $ echo string | command
    

    上面代码中,Here 文档相当于echo命令的重定向。

    所以,Here 字符串只适合那些可以接受标准输入作为参数的命令,对于其他命令无效,比如echo命令就不能用 Here 文档作为参数。

    $ echo << _example_
    hello
    _example_
    

    上面例子不会有任何输出,因为 Here 文档对于echo命令无效。

    此外,Here 文档也不能作为变量的值,只能用于命令的参数。

    Here 字符串#

    Here 文档还有一个变体,叫做 Here 字符串(Here string),使用三个小于号(<<<)表示。

    <<< string
    

    它的作用是将字符串通过标准输入,传递给命令。

    有些命令直接接受给定的参数,与通过标准输入接受参数,结果是不一样的。所以才有了这个语法,使得将字符串通过标准输入传递给命令更方便,比如cat命令只接受标准输入传入的字符串。

    $ cat <<< 'hi there'
    # 等同于
    $ echo 'hi there' | cat
    

    上面的第一种语法使用了 Here 字符串,要比第二种语法看上去语义更好,也更简洁。

    $ md5sum <<< 'ddd'
    # 等同于
    $ echo 'ddd' | md5sum
    

    上面例子中,md5sum命令只能接受标准输入作为参数,不能直接将字符串放在命令后面,会被当作文件名,即md5sum ddd里面的ddd会被解释成文件名。这时就可以用 Here 字符串,将字符串传给md5sum命令。

    展开全文
  • Bash Shell 中单引号和双引号的区别

    千次阅读 2022-04-12 11:07:24
    你会经常在 Linux 命令行使用引号,处理文件名的空格?你使用引号。处理特殊字符?你再次使用引号引号是 Linux shell 的“特殊功能”,它...Shell 的单引号会忽略其中所有类型的特殊字符,单引号之间的所有

    你会经常在 Linux 命令行中使用引号,处理文件名中的空格?你使用引号。处理特殊字符?你再次使用引号。

    引号是 Linux shell 中的“特殊功能”,它可能会让人感到困惑,特别是如果您不熟悉 Linux 命令和 shell 脚本。

    我将解释不同类型的引号字符及其在 shell 脚本中的用法。

    有四种不同类型的引号字符:

    • 单引号 ’
    • 双引号&#