Bash for loop с подстановочными знаками и скрытыми файлами - PullRequest
20 голосов
/ 26 января 2010

Просто остроумие простого сценария оболочки и немного запутанный:

Вот мой сценарий:

% 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*"

Также не работает.

Ответы [ 4 ]

45 голосов
/ 26 января 2010

Глобализация по умолчанию в bash не включает имена файлов, начинающиеся с a. (он же скрытый файл).

Вы можете изменить это с помощью

shopt -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.

12 голосов
/ 26 января 2010

Если вы хотите скрытый и не скрытый, установите dotglob (bash)

#!/bin/bash
shopt -s dotglob
for file in *
do
 echo "$file"
done
10 голосов
/ 26 января 2010

Да, . на передней панели является специальным и обычно не будет соответствовать подстановочному знаку *, как описано на странице руководства bash (и является общим для большинства оболочек Unix):

Когда шаблон используется для расширения имени пути, символ & ldquo;. & Rdquo; в начале имени или сразу после косой черты совпадать явно, если параметр оболочки dotglob не задавать. При сопоставлении имени пути символ косой черты должен всегда совпадать явно В других случаях & ldquo;. & Rdquo; персонаж не обрабатывается специально.

7 голосов
/ 26 января 2010

FILES=".bash*" работает, потому что имя скрытых файлов начинается с .

FILES="bash*" не работает, потому что имя скрытых файлов начинается с ., а не b

FILES="*bash*" не работает, поскольку подстановочный знак * в начале строки не содержит скрытых файлов.

...