最近,我正忙着编写 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
可以用作*
通配符。这取决于引用哪一个将采取行动。结果通常不同,有时甚至是错误的。您需要知道是否希望外壳扩展*
。