Синтаксическая ошибка около неожиданного маркера' ('

Когда я использую ниже кода в терминале Ubuntu, он хорошо работает:

rm !(*.sh) -rf

Но если я помещаю тот же линейный код в сценарий оболочки (clean.sh) и выполняю сценарий оболочки от терминала, он бросает ошибку:

сценарий clean.sh:

#!/bin/bash
rm !(*.sh) -rf

Ошибка я добираюсь:

./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'

можно ли помочь?

11
задан 9 August 2015 в 13:03

3 ответа

rm !(*.sh) a extglob синтаксис, что означает, удаляет все файлы кроме тех, которые имеют .sh расширение.

В Вашем интерактивном bash экземпляр, опция оболочки extglob идет:

$ shopt extglob 
extglob         on

Теперь когда Ваш сценарий работает в подоболочке, необходимо включить extglob путем добавления этого в начале сценария:

shopt -s extglob

Таким образом, Ваш сценарий похож:

#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)

РЕДАКТИРОВАНИЕ:

Удалить все файлы кроме .sh дополнительное использование GLOBIGNORE (поскольку Вы не хотите включать extglob) :

#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *

Пример:

$ ls -1
barbar
bar.sh
egg
foo.sh
spam

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh
23
ответ дан 23 November 2019 в 03:52

Хорошо, это - кросспостинг, но я должен записать ответ. ;)

Вы могли использовать find вместо этого

find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;
4
ответ дан 23 November 2019 в 03:52

Необходимо повернуться extglob на:

shopt -s extglob
2
ответ дан 23 November 2019 в 03:52

Другие вопросы по тегам:

Похожие вопросы: