linux shell中 " " 与 ' ' 有什么区别?

 创建文件

[root@master-1 ~]# cat path.service
C:\\Program Files\\MyApp \
qwe \\
qq \\
az

需求:使用sed将 \\ 替换为 \

执行sed命令,并使用双引号" "

[root@master-1 ~]# sed -i "s/\\\\/\\/g" path.service
sed:-e 表达式 #1,字符 8:未终止的“s”命令

执行sed命令,并使用双引号 ' '

[root@master-1 ~]# sed -i 's/\\\\/\\/g' path.service

为什么在上面的命令中,单引号执行成功了,而双引号则失败?

问题解析:

这个问题的核心在于 双引号 (")单引号 (')sed 和 shell 中的解析方式不同。

差异分析:

  1. 单引号 (')

    • 单引号会将引号内的内容视为一个完整的字符串,原样传递给 sed,不会对其中的字符进行额外的解释或转义。
    • 示例
      • sed -i 's/\\\\/\\/g' path.service

        传递给 sed 的字符串是:

        s/\\\\/\\/g

        这个语法是 sed 能正确理解的。

        可以理解处理了两次,一次是shell,一次是sed。 

双引号 (")

  • 双引号会让 shell 先解析引号中的内容,然后再将解析后的结果传递给 sed
  • 在你的命令中:
sed -i "s/\\\\/\\/g" path.service

shell 会对双反斜杠 \\ 进行一次转义,结果是 s/\\/\/g,传递给 sed 后不符合预期的替换格式,因此失败。

具体区别的行为:

  • 单引号保留了 \\\\\\/ 的原始形式,sed 能正确解析它们为匹配 \\ 并替换为 \
  • 双引号导致 shell 提前处理反斜杠,破坏了原本的 sed 替换规则。

 

posted @ 2024-12-16 14:37  不会跳舞的胖子  阅读(49)  评论(0编辑  收藏  举报