>>Где я не прав?
>
>IMHO сам case не способен распознавать `|', этот символ управляет парсером sh,
>который уже закончил свою работу к моменту подстановки значений переменных.
>
Не понял :( Какой парсер, если переменная EXTS действительно получает указанное значение и его можно вывести через echo. Никаких каналов при этом не образуется, это именно строка и если её писать прямо в case-е, оно ведь работает. Не думаю, что при этом происходит какая-то внешняя по отношению к case работа с ней.
>> Или может быть есть другой столь-же изящный способ проверки (только без
>> циклов)?
>
>EXTS="mp3|wav"
>ext="mp3"
>cat <<EOM|sh
> case $ext in
> $EXTS) echo "FOUND!" ;;
> esac
>EOM
Что это там за знак такой?
>
>или так:
>
>EXTS="mp3|wav"
>ext="mp3"
>echo $EXTS | grep -q $ext && echo Found!
>
>В этом случае ты можешь взять свой список из файла.
Да мне не файл, мне в каталоге надо найти все файлы с указанными расширениями, ну и потом обработать найденное. Т.е. сейчас это работает в таком контексте:
for song in ${album}/* ; do # для всех файлов альбома
name_song=${song%.*}
ext_song=${song:${#name_song}+1}
case $ext_song in ( mp3|wav|mod|mid|wma|it|s3m|mo3|xm|stm|669|mtm|stm )
echo "${win_path}${isp//\//\\}\\${song//\//\\}" >>$global_list
;;
esac
done # закончили с альбомом
а поскольку количество файлов ОЧЕНЬ большое, не хотелось связываться с циклами проверки и вызовами внешних программ, хотя с другой стороны ещё придётся кодировку менять для винды... :(