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*"
Также не работает.
Ответы
Ответ 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