Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: [Решено] Осваиваю Bash, помогите упростить скрипт  (Прочитано 1051 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Disaster1986

  • Автор темы
  • Участник
  • *
  • Сообщений: 246
  • Что делает эта кнопка?
    • Просмотр профиля
Имеем такой скрипт:
#!/bin/bash

s=$(mocp --info | grep State | sed 's/State: //gi')
case $s in
PLAY|PAUSE) mocp --stop ;;
esac
cd /home/zaycakitayca/.moc/
mv playlist.m3u playlist99.m3u
mv playlist01.m3u playlist.m3u
bash -c 'i=1; ls playlist??.m3u | while read ; do mv "$REPLY" "playlist$(printf %02u $i).${REPLY//*.}" ; ((i++)) ; done'
case $s in
PLAY) mocp --play ;;
esac
exit 0
Всё работает, однако код кажется слишком громоздким. Особенно напрягает использование case, но if для такого условия правильно написать я не смог. Ещё не нравится строка bash -c 'i=1; ls playlist??.m3u | while read ; do mv "$REPLY" "playlist$(printf %02u $i).${REPLY//*.}" ; ((i++)) ; done'не понимаю, почему то же самое без bash -c не работает. Как можно упростить этот скрипт?
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 24 Февраля 2011, 12:56:32 от Disaster1986 »

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: Осваиваю Bash, помогите упростить скрипт
« Ответ #1 : 23 Февраля 2011, 10:49:22 »
bash -c 'i=1; ls playlist??.m3u | while read ; do mv "$REPLY" "playlist$(printf %02u $i).${REPLY//*.}" ; ((i++)) ; done'
Это идет поиск и переименовывание плейлистов? Мне больше нравится вот такой способ:
IFS=$'\n'
i=1

for j in `ls ./ | grep ".m3u"`
do
echo ""$j"+"$i"" #тут должно быть переименовывание
((i++))
done

Находятся все пробелы в заданной папке, независимо от наличия в них пробелов. Чем вас case не устраивает?
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Осваиваю Bash, помогите упростить скрипт
« Ответ #2 : 23 Февраля 2011, 11:01:25 »
не понимаю, почему то же самое без bash -c не работает
Ставьте echo перед mv и смотрите, что пишет.

Оффлайн RandomNT

  • Любитель
  • *
  • Сообщений: 80
    • Просмотр профиля
Re: Осваиваю Bash, помогите упростить скрипт
« Ответ #3 : 23 Февраля 2011, 13:41:36 »
if будет так

if [ "$s" == "PLAY" ] || [ "$s" == "PAUSE" ]; then
  mocp --stop
fi

if [ "$s" == "PLAY" ]; then
  mocp --play
fi

Оффлайн Disaster1986

  • Автор темы
  • Участник
  • *
  • Сообщений: 246
  • Что делает эта кнопка?
    • Просмотр профиля
Re: Осваиваю Bash, помогите упростить скрипт
« Ответ #4 : 23 Февраля 2011, 20:27:41 »
if будет так

if [ "$s" == "PLAY" ] || [ "$s" == "PAUSE" ]; then
  mocp --stop
fi

if [ "$s" == "PLAY" ]; then
  mocp --play
fi


В ответ пишет такую ерунду:
[: 6: PLAY: unexpected operator
[: 6: PLAY: unexpected operator
[: 13: PLAY: unexpected operator

Это идет поиск и переименовывание плейлистов?

Не совсем так. В папку кидаются файлы playlist01.m3u, playlist02.m3u и т.д, а также файл playlist.m3u, который использует MOC. При запуске скрипта файл playlist01.m3u встаёт на место файла playlist.m3u, а у остальных уменьшается номер (02 => 01; 03 =>02 и т.д.)

Чем вас case не устраивает?

Просто всегда казалось лишним использовать case там, где вполне справился бы if

Axa-Ru

  • Гость
Re: Осваиваю Bash, помогите упростить скрипт
« Ответ #5 : 23 Февраля 2011, 21:00:30 »
Сдается мне вы между [ и "$s" пробельчик не вставили.
Дайте полный текст скрипта.

Оффлайн Disaster1986

  • Автор темы
  • Участник
  • *
  • Сообщений: 246
  • Что делает эта кнопка?
    • Просмотр профиля
Re: Осваиваю Bash, помогите упростить скрипт
« Ответ #6 : 23 Февраля 2011, 21:30:13 »
Сдается мне вы между [ и "$s" пробельчик не вставили.

Отнюдь, я скопипастил условия, которые написал RandomNT, пробелы при этом остались на месте. Остальная часть скрипта без изменений
(Нажмите, чтобы показать/скрыть)

Axa-Ru

  • Гость
Re: Осваиваю Bash, помогите упростить скрипт
« Ответ #7 : 23 Февраля 2011, 21:42:24 »
Вставте между строками вывод переменной s

s=$(mocp --info | grep State | sed 's/State: //gi')
echo $s
if [ "$s" == "PLAY" ] || [ "$s" == "PAUSE" ]; then

Я взял ваш текст закоментировал то чего у меня нет и все работает.
(Нажмите, чтобы показать/скрыть)

Оффлайн Disaster1986

  • Автор темы
  • Участник
  • *
  • Сообщений: 246
  • Что делает эта кнопка?
    • Просмотр профиля
Re: Осваиваю Bash, помогите упростить скрипт
« Ответ #8 : 23 Февраля 2011, 22:05:50 »
Заменил s=$(mocp --info | grep State | sed 's/State: //gi') на s=PLAY. Тот же результат. echo $s выводит PLAY, как и положено, а условие не работает. Ничего не понимаю...

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: Осваиваю Bash, помогите упростить скрипт
« Ответ #9 : 23 Февраля 2011, 22:10:38 »
Опишите задачу словами. Что в какой момент должно происходить и какой нужен результат.
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн RandomNT

  • Любитель
  • *
  • Сообщений: 80
    • Просмотр профиля
Re: Осваиваю Bash, помогите упростить скрипт
« Ответ #10 : 23 Февраля 2011, 22:42:19 »
скрипт используется для выбора плэйлиста в MOC для 3-х и более плейлистов, запуск по хоткею (ибо задолбало открывать терминал для переключения плейлиста)
есть подозрение что скрипт исполняется не в баше

Оффлайн Disaster1986

  • Автор темы
  • Участник
  • *
  • Сообщений: 246
  • Что делает эта кнопка?
    • Просмотр профиля
Re: Осваиваю Bash, помогите упростить скрипт
« Ответ #11 : 24 Февраля 2011, 12:56:10 »
есть подозрение что скрипт исполняется не в баше

Гениально! Дописал bash в запускаторе, всё заработало. Спасибо за помощь.

А в чём, если не секрет, оно могло запускаться до этого?

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
А в чём, если не секрет, оно могло запускаться до этого?
dash, sh

Axa-Ru

  • Гость
а вот это для чего тогда?
#!/bin/bash

 

Страница сгенерирована за 0.031 секунд. Запросов: 26.