В таком примере:
EXTS="mp3|wav"
ext="mp3"
case $ext in ( $EXTS )
echo "FOUND!"
;;
esacНо если написать так:
ext="mp3"
case $ext in ( mp3|wav )
echo "FOUND!"
;;
esac
то работает.Где я не прав?
Или может быть есть другой столь-же изящный способ проверки (только без циклов)?PS: Разумеется расширений будет не 2, это только пример.
>Где я не прав?IMHO сам case не способен распознавать `|', этот символ управляет парсером sh, который уже закончил свою работу к моменту подстановки значений переменных.
> Или может быть есть другой столь-же изящный способ проверки (только без
> циклов)?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!В этом случае ты можешь взять свой список из файла.
>>Где я не прав?
>
>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 # закончили с альбомома поскольку количество файлов ОЧЕНЬ большое, не хотелось связываться с циклами проверки и вызовами внешних программ, хотя с другой стороны ещё придётся кодировку менять для винды... :(
Просто беда какая-то. Работает у меня ващ пример. Да и с чего бы ему не работать?>В таком примере:
>EXTS="mp3|wav"
>ext="mp3"
>case $ext in ( $EXTS )
> echo "FOUND!"
> ;;
>esac
>
>Но если написать так:
>ext="mp3"
>case $ext in ( mp3|wav )
> echo "FOUND!"
> ;;
>esac
>то работает.
>
>Где я не прав?
>Или может быть есть другой столь-же изящный способ проверки (только без циклов)?
>
>
>PS: Разумеется расширений будет не 2, это только пример.
>Просто беда какая-то. Работает у меня ващ пример. Да и с чего
>бы ему не работать?
>
>>В таком примере:
>>EXTS="mp3|wav"
>>ext="mp3"
>>case $ext in ( $EXTS )
>> echo "FOUND!"
>> ;;
>>esacВот с этого места поподробнее. Может у нас шеллы разные? Вот мой:
GNU bash, version 2.05.0(1)-release (i386-slackware-linux-gnu)
Copyright 2000 Free Software Foundation, Inc.