Подтвердить что ты не робот

Bash для цикла с подстановочными знаками и скрытыми файлами

Просто запустив простую оболочку script и немного запутавшись:

Вот мой script:

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

Это не ожидаемый результат, а не то, что я ожидаю. Мне не разрешено иметь дикую карту в начале имени файла? Это. в начале имени файла "special" каким-то образом?

Настройка

FILES="bash*"

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Значение по умолчанию в bash не включает имена файлов, начинающиеся с символа. (ака скрытые файлы).

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

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.

Ответ 3

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

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

Ответ 4

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

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