LinuxForum.Fans
Тема

extglob

Автор: 1000Mhz 8 сообщений 2540 просмотров
03.12.2014 18:59 #403847
text
#!/bin/sh
shopt -s extglob
if (( $# == 1 ))
then
    case "$1" in
        *.mp3 )
            .. ;;
        *.(png|jpg|jpeg) )
            .. ;;
        *.!(mp3|jpg|png|pdf|htm[l]) )
            .. ;;
    esac
else
..

В итоге:
[console]line 8: syntax error near unexpected token `('
` *.(png|jpg|jpeg) )'[/console]

Что не так-то? *CRAZY*

03.12.2014 19:22 · отредактировано #403853

Рабочие экспы '*+(png|jpg|jpeg)' и '*?(png|jpg|jpeg)'
Не дочитал что-то :D

03.12.2014 19:59 #403859

FYI: extglob тут не нужен... достаточно просто:*.{png,jpg,jpeg}

03.12.2014 20:22 #403861

Без extglob не прокатит *.!(mp3|jpg|png|pdf|htm[l])
Конечно, можно записать иначе.. но зачем?

03.12.2014 20:39 #403862
"1000Mhz" написал:
Без extglob не прокатит *.!(mp3|jpg|png|pdf|htm[l])

mp3 jpg png обрабатываются первыми условиями, вообще непонятно, зачем они здесь...

text

case "$1" in
        *.mp3 )
            .. ;;
        *.{png,jpg,jpeg} )
            .. ;;
        *.{pdf,htm{,l}} )  
           ;;
        *.*
            .. ;;
esac
03.12.2014 20:50 · отредактировано #403864

Ну нужно же было как-то записать в условиях case "файл не mp3, не jpg, не png, не pdf и не |htm[l], а какой-то неизвестный"?

UPD А, не нужно! Туплю))

04.12.2014 03:32 #403898
"1000Mhz" написал:
Что не так-то

зачем в этой задаче вообще extglob?
Вот смотрите на такой код:

text
#!/bin/bash

for i in {0..9}; do case "$i" in 3) echo "3($i)" ;& 4) echo "4($i)" ;& 5) echo "5($i)" ;; *) echo "other($i)" ;; esac done

[console]other(0)
other(1)
other(2)
3(3)
4(3)
5(3)
4(4)
5(4)
5(5)
other(6)
other(7)
other(8)
other(9)
[/console]
как видите, до точки echo "5" доходит и 3, и 4, и 5.

ЗЫЖ кроме ;& есть ещё ;;&

04.12.2014 16:45 #403965

drBatty, спасибо за пример, не знал про такие штуки.

Войдите или зарегистрируйтесь, чтобы ответить.