我对 bash 中双引号的使用感到困惑

我对 bash 中双引号的使用感到困惑

最近,我正忙着编写 bash 脚本来满足我的需求。然而,在编码过程中,我发现双引号的使用有时是相互矛盾的。例如,我尝试查找一些与正则表达式匹配的文件,例如ls "*.log".我习惯性地*.log用双引号括起来,但出现错误cannot access '*.txt': No such file or directory

之后,我从教程中找到了原因,*当你想要*将行为作为通配符时,将双引号放在双引号中是没有用的。因此,ls *.log才是正确的用法。

但是,当我将grep命令与正则表达式一起使用时,所有三个(""''、非引号)都不会改变我的正则表达式的原始含义,例如grep "^s.txt".此时,双引号使正则表达式处于活动状态。

命令之间是否存在一些设计冲突?您能否给我一些技巧来快速掌握常用命令引号的正确用法?

答案1

如果是ls *.log外壳的话扩展通配符之前ls开始。然后ls给出结果。该工具*本身没有扩展功能。

如果grep "^s.txt"shell 只删除引号(通常仍然有用来告诉贝壳如何处理带引号的字符串),grep获取^s.txt并完成其工作。如果未加引号,^s.txt则 shell 不执行任何操作,因此结果是相同的。但一般情况下可能会有所不同(例如a*.*txt)。

比较一下:find和通配符(和通配符)。和 shell都find -name可以用作*通配符。这取决于引用哪一个将采取行动。结果通常不同,有时甚至是错误的。您需要知道是否希望外壳扩展*

相关内容