Сопоставление с образцом не работает в скрипте bash - PullRequest
13 голосов
/ 06 апреля 2019

Использование сопоставления с шаблоном !("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").Такая же ошибка имеет место.Что здесь происходит, почему это не работает в сценарии?

Ответы [ 3 ]

12 голосов
/ 06 апреля 2019

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

shopt -s extglob

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

5 голосов
/ 06 апреля 2019

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

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

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

3 голосов
/ 06 апреля 2019

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

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