在几本手册中(包括官方的GNU / Linux命令行工具tldp.org)建议使用单引号(或双引号)来避免bash解释通配符或正则表达式符号,如插入符号(^)和美元( $)。
但在某些例子中,没有必要使用单/双引号。例如:
(1)
$ touch 'fo*'
和
$ touch fo*
在两个命令行表单中创建相同的文件fo*
。
(2)
$ grep '^foo' file.txt
和
$ grep ^foo file.txt
在file.txt的行的开头搜索foo
作为字符串。
为什么手册建议使用单/双引号来避免bash解释,如果bash实际上并不首先解释某些通配符和正则表达式符号?
答案 0 :(得分:6)
如果当前目录中有一个名为foo
的文件,则touch 'fo*'
会触及fo*
,但touch fo*
会扩展为touch foo
并触摸该nullglob
如果设置了fo*
选项且文件名不匹配touch fo*
,则touch
会扩展为failglob
并抱怨缺少的操作数。
如果设置了fo*
选项且文件名不匹配touch fo*
,则{{1}}会立即导致错误。
答案 1 :(得分:1)
Bash确实扩展了所有通配符,正如前面提到的那样。
<强>了nullglob 强>:
shopt -q nullglob && ! compgen -G 'f*' >/dev/null && touch f*
touch: missing file operand
了nullglob
如果设置,Bash允许不匹配任何文件的文件名模式扩展为空字符串,而不是自己。
<强> failglob 强>:
shopt -q failglob && ! compgen -G 'f*' >/dev/null && touch f*
bash: no match: f*
failglob
如果设置,在文件名扩展期间无法匹配文件名的模式会导致扩展错误。