2010-01-25 30 views
16

只需知晓一个简单的shell脚本,有点糊涂循环:猛砸与通配符和隐藏文件

这里是我的脚本:

% for f in $FILES; do echo "Processing $f file.."; done 

命令:

ls -la | grep bash 

生产:

% ls -a | grep bash 
.bash_from_cshrc 
.bash_history 
.bash_profile 
.bashrc 

FILES=".bash*" 

我得到与ls -a相同的结果(格式不同)。然而,当

FILES="*bash*" 

我得到这样的输出:

Processing *bash* file.. 

这不是预期的输出,而不是我所期望的。我不允许在文件名的开头有一个通配符?是个 。在某种程度上文件名称“特殊”的开头?

设置

FILES="bash*" 

也不起作用。

+1

正如下面的号说,你可能想使用一个bash标志修改行为。 (shopt -s dotglob) – 2010-01-26 16:36:51

回答

6

FILES=".bash*"作品,因为隐藏文件名以.

FILES="bash*"开始不起作用,因为隐藏的文件名,为.不是b

FILES="*bash*"开始不会,因为在*通配符工作字符串的开头会省略隐藏文件。

+6

所以如果我想这样做,我应该做文件=“。* bash *”?但是如果我想要隐藏而不是隐藏的文件呢? – sixtyfootersdude 2010-01-25 21:42:50

10

是的,.在前面是特殊的,并且通常不会被*通配符匹配,如bash的手册页中(和常见的大多数Unix外壳):

当模式用于路径名扩展,字符“。 ” 在名称的开头或紧接斜线后必须明确地匹配 ,除非shell选项dotglob是 集合。匹配路径名时,必须始终明确匹配斜杠字符 。在其他情况下,“。 ” 字符不被特别处理。

41

bash中的默认globbing不包括以a开头的文件名。 (又名隐藏文件)。

可以更改与

禁用了javascript -s dotglob

$ ls -a 
. .. .a .b .c d e f 
$ ls * 
d e f 
$ shopt -s dotglob 
$ ls * 
.a .b .c d e f 
$ 

要再次关闭,运行shopt -u dotglob

+0

我总是忘记购物!感谢这个答案! – 2013-03-15 00:00:53

8

如果你想隐藏的和非隐藏,设置dotglob(bash)的

#!/bin/bash 
shopt -s dotglob 
for file in * 
do 
echo "$file" 
done