网站/小程序/APP个性化定制开发,二开,改版等服务,加扣:8582-36016

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


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

contenteditable="true" data-cke-enter-mode="2" data-cke-saved-name="i0" data-cke-widget-data="%7B%22url%22%3Anull%2C%22text%22%3A%22%5Cn%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease1.9.2%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DL9C2%22%2C%22id%22%3A%22b2cHEb-1634178650705%22%2C%22classes%22%3Anull%7D" data-cke-widget-editable="text" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-link-icon="https://csdnimg.cn/release/blog_editor_html/release1.9.2/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=L9C2" data-link-title=" " data-widget="csdnlink" title=" " name="i0">

单引号

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

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

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

https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease1.9.2%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DL9C2%22%2C%22id%22%3A%22IHIwLG-1634178650702%22%2C%22classes%22%3Anull%7D" data-cke-widget-editable="text" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-link-icon="https://csdnimg.cn/release/blog_editor_html/release1.9.2/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=L9C2" data-link-title=" " data-widget="csdnlink" title=" " name="i1">

双引号

双引号类似于单引号,只是它允许 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 脚本过程中,就不会在单双引号上出错了


                  评论 0

                  暂无评论
                  0
                  0
                  0
                  立即
                  投稿
                  发表
                  评论
                  返回
                  顶部