2016-10-21 3 views
0

В консоли пользователя У меня есть bash:Bash работает только в интерактивной оболочке, но не в сценарии

$ echo $SHELL 
/bin/bash 
$ bash --version 
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu) 

У меня есть код в файле test.sh:

$ cat test.sh 
aaa='---aa-aa---' 
echo "${aaa}" 
echo 'does not work...' 
# trim "-" 
echo ${aaa/+(-)} 
echo ${aaa%%+(-)} 
echo 'works for one symbol...' 
echo ${aaa%-} 
echo ${aaa/-} 

последние две строки работайте хорошо, но предыдущие.

$ bash test.sh 
---aa-aa--- 
does not work... 
---aa-aa--- 
---aa-aa--- 
works for one symbol... 
---aa-aa-- 
--aa-aa--- 

В то же время, если бы вы попытаетесь сделать эту консоль он работает:

$ aaa='---aa-aa---' 
$ echo ${aaa/+(-)} 
aa-aa--- 
$ echo ${aaa%%+(-)} 
---aa-aa 

Итак, почему он не работает в сценарии?

+0

Попытка решить, следует ли закрыть это как дубликат https://stackoverflow.com/questions/26726264/why-does-the-pattern-work-in-my-interactive-shell-but-not-a- сценарий, или сделать это наоборот. @ tripleee, у вас есть мнение здесь? –

+0

... на самом деле, по мнению, я думаю, что этот вопрос вопроса более четко задан, чем другой, достаточно, чтобы отрицать временное преимущество другого (от первого запроса). –

ответ

3

У вас, кажется, есть shopt -s extglob в вашей интерактивной оболочке, которая включает расширенное подтягивание. Это не поведение по умолчанию и должно быть явно включено в вашем скрипте. См. extended pattern matching in the bash hackers wiki.

+0

Хм ... Но эта команда означает ?. . – Kirby

+0

Он позволяет использовать функцию расширенного подгонки. Я обновлю ответ на ссылку. – tripleee

+1

Без 'shopt -s extglob' шаблон' + (-) '- это буквальная 4-значная строка, которая соответствует, а не шаблон, соответствующий одному или нескольким' -'. – chepner

Смежные вопросы