Сопоставление с образцом не работает в скрипте bash

Использование сопоставления с шаблоном !("file1") не работает в скрипте bash, но будет работать в командной строке.

Например:

ls  !("file1"|"file2")

Это перечислит все файлы в каталоге, кроме file1 и file2.

Когда эта строка выполняется в скрипте, эта ошибка отображается:

./script.sh: line 1: syntax error near unexpected token '('
./script.sh: line 1: ' ls  !("file1"|"file2") ' 

Независимо от того, что используется rm -v !("file1"). Такая же ошибка имеет место. Что здесь происходит, почему это не работает в сценарии?

Ответ 1

Расширенный синтаксис glob, который вы пытаетесь использовать, по умолчанию отключен; Вы должны включить его отдельно в каждом сценарии, где вы хотите его использовать.

shopt -s extglob

Скрипты не должны использовать ls хотя я думаю, что вы использовали его просто как заполнитель здесь.

Ответ 2

Глобирование не работает таким образом, если вы не включите extglob оболочки extglob. Вместо этого я рекомендую использовать find:

find . -maxdepth 1 -not -name '<NAME>' -or -name '<NAME>' -delete

перед выполнением этой команды с -delete убедитесь, что вывод правильный

Ответ 3

Метод с настройками по умолчанию и без внешних процедур:

for f in *; do [[ $f =~ ^file[12]$ ]] || echo "$f"; done