Сопоставление с образцом не работает в скрипте 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