Всем привет. Хочу в текущем каталоге найти все папки, являющиеся непосредственными потомками и имеющие название в форме [префикс][число]. Ручным способом решение нашёл:
dvolosnykh@xakac:/aux/vm/kvm$ bash
dvolosnykh@xakac:/aux/vm/kvm$ declare -r vmBaseName="rsoivm"
dvolosnykh@xakac:/aux/vm/kvm$ ls $vmBaseName* -d
rsoivm0 rsoivm1 rsoivm22 rsoivm33 rsoivm.cfg rsoivm.log rsoivmX
dvolosnykh@xakac:/aux/vm/kvm$ find $vmBaseName+([[:digit:]]) -maxdepth 0 -type d
rsoivm0
rsoivm1
rsoivm33
dvolosnykh@xakac:/aux/vm/kvm$ exit
exit
А вот сценарий выдаёт ошибку:
uninstall_aux.sh: строка 24: ошибка синтаксиса около неожиданной лексемы `('
uninstall_aux.sh: строка 24: `find $vmBaseName+([[:digit:]]) -maxdepth 0 -type d'
Вообще эту команду изначально хочется вставить в оператор $(...), чтобы сохранить результат в переменную. Но:
Bash Reference Manual
When using the $(command) form, all characters between the parentheses make up the command; none are treated specially.
С этим вроде всё понятно. А вот почему она просто, будучи самостоятельной строкой в сценарии не выполняется --- нет.
Экранирую скобки:
find $vmBaseName+\([[:digit:]]\) -maxdepth 0 -type d
find: `rsoivm+([[:digit:]])': Нет такого файла или каталога
А вот такой вариант работает, но это, конечно, не тот результат:
find $vmBaseName[[:digit:]] -maxdepth 0 -type d
rsoivm0
rsoivm1
Решение с регулярными выражениями работает, но уже просто принципиально интересно либо в чём разница, либо что я упускаю... Спасибо.