2010-01-25 65 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