URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3086
[ Назад ]

Исходное сообщение
"Не подставляется переменная в команде case"

Отправлено WaprOld , 22-Июн-04 02:37 
В таком примере:
EXTS="mp3|wav"
ext="mp3"
case $ext in ( $EXTS )
echo "FOUND!"
;;
esac

Но если написать так:
ext="mp3"
case $ext in ( mp3|wav )
echo "FOUND!"
;;
esac
то работает.

Где я не прав?
Или может быть есть другой столь-же изящный способ проверки (только без циклов)?

PS: Разумеется расширений будет не 2, это только пример.


Содержание

Сообщения в этом обсуждении
"Не подставляется переменная в команде case"
Отправлено ACCA , 23-Июн-04 03:09 
>Где я не прав?

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!

В этом случае ты можешь взять свой список из файла.


"Не подставляется переменная в команде case"
Отправлено WaprOld , 23-Июн-04 03:49 
>>Где я не прав?
>
>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 # закончили с альбомом

а поскольку количество файлов ОЧЕНЬ большое, не хотелось связываться с циклами проверки и вызовами внешних программ, хотя с другой стороны ещё придётся кодировку менять для винды... :(


"Не подставляется переменная в команде case"
Отправлено vnp , 23-Июн-04 06:01 
Просто беда какая-то. Работает у меня ващ пример. Да и с чего бы ему не работать?

>В таком примере:
>EXTS="mp3|wav"
>ext="mp3"
>case $ext in ( $EXTS )
> echo "FOUND!"
> ;;
>esac
>
>Но если написать так:
>ext="mp3"
>case $ext in ( mp3|wav )
> echo "FOUND!"
> ;;
>esac
>то работает.
>
>Где я не прав?
>Или может быть есть другой столь-же изящный способ проверки (только без циклов)?
>
>
>PS: Разумеется расширений будет не 2, это только пример.



"Не подставляется переменная в команде case"
Отправлено WaprOld , 23-Июн-04 13:32 
>Просто беда какая-то. Работает у меня ващ пример. Да и с чего
>бы ему не работать?
>
>>В таком примере:
>>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.