Да, это - нормальное поведение. Единственное Управление-D обычно только вспыхивает, если это - начало строки. Это выходит с одним Управлением-D:
$ cat > foo.txt
bar
baz
^D
[ -f "$myregexp" ]
или [[ -f $myregexp ]]
тесты, если существует файл, названный точно $myregexp
. (Обратите внимание с одиночными скобками, необходимость в двойных кавычках.)
Если Вы хотите протестировать на существование файлов, соответствующих шаблону шарика, нет никакого прямого пути. Необходимо сделать это на двух шагах: сначала генерируйте список соответствий, затем протестируйте, если тот список пуст.
a=( ~(Ni)*.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …
Это использует много ksh-определенных функций:
~(N)
префикс для генерации пустого списка, если там не идет ни в какое сравнение;~(i)
префикс, чтобы сделать нечувствительное к регистру соответствие;@(foo|bar)
синтаксис шарика для соответствия foo
или bar
Вот эквивалентный удар. В ударе Вы получаете случай пустое расширение для несоответствия шарикам и нечувствительности к регистру от опций; extglob
для @(foo|bar)
синтаксис и другие ksh расширения шарика.
shopt -s nocaseglob nullglob extglob
a=( *.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …
Вот zsh эквивалент. extended_glob
опция необходима для (#i)
префикс для нечувствительного к регистру соответствия. (N)
спецификатор шарика указывает на пустое расширение для несоответствия шарикам.
setopt extended_glob
a=( (#i)*.(tgz|tar.gz)(N) )
if [[ ${#a} -ne 0 ]]; then …
Вы, которых пример не дает ключу к разгадке то, что источник Вы сравниваете. Если Вы хотите перечислить файлы в текущем каталоге, можно просто представить некоторые шарики в виде строки вместе как это:
for file in *.tgz *.tar.gz *.TGZ *.TAR.GZ; do
echo $file
done
Если Вы хотите протестировать имя файла в строке против partern, попробуйте это:
if [[ ( $file =~ .*\.(tgz|TGZ|tar\.gz|TAR\.GZ) ) ]]; then
echo $file
fi
Или можно использовать оператор выбора:
case $file in
*.tgz|*.tar.gz|*.TGZ|*.TAR.GZ)
echo $file
;;
esac
Можно даже сделать нечувствительное к регистру соответствие простым выражениям шарика:
for f in *.[Tt][Gg][Zz] *.[Tt][Aa][Rr].[Gg][Zz]; do
echo $f
done