LinuxForum.Fans
Тема

Простые вопросы по bash

Автор: Aspedin 15 сообщений 5787 просмотров
#54103

Продолжая темы http://linuxforum.ru/viewtopic.php?id=1161 и http://linuxforum.ru/viewtopic.php?id=3555

Вопросы по bash:
1.Как отрезать имя файла от типа. Т.е. от file_name.mp3 отрезать file_name
самый элементарный вариант cut -f1 -d. file_name.mp3 не подходит ибо в имени файла может быть ни одна точка.

2.Если вывод mp3info, вырезать выделенные части

File: 11 - Зима.mp3
Title: Зима Track: 11
Artist: Буготак
Album: Человек из тайги Year: 2007
Comment: Genre: Ethnic [48]

3.Реализация флагов(-a,-b,-c...)в bash
Слышал про $@ но нужна конкретная ссылка.

#57103

Чего-то не очень горят отвечать wink
1)

text
echo 'имя файла.track-01.артист.альбом и наконец расширение.mp3' | sed 's/\.[^.]*$//'

Разбор полёта: всё очень просто удаляем всё начиная с последней точки и до конца. Никаких предположений о расширении нет, единственное предположение, что начиная с последней точки (если она есть) идёт расширение.

2) Т.к. в тэгах могуть быть пробелы, те же точки и т.п. парсить вывод не очень просто, слишком много вариантов надо предусмотреть, потому лучше пользоваться самим mp3info для извлечения самой информации.
Вывод названия(Title):

text
mp3info -p "%t" имя_файла.mp3

Вывод номера трэка:

text
mp3info -p "%n" имя_файла.mp3

Вывод артиста:

text
mp3info -p "%a" имя_файла.mp3

Вывод альбома:

text
mp3info -p "%l" имя_файла.mp3

Вывод года:

text
mp3info -p "%y" имя_файла.mp3

Вывод жанра:

text
mp3info -p "%g" имя_файла.mp3

Можно комбинировать, к примеру вывод названия + артист (разделитель "_"):

text
mp3info -p "%t_%a" имя_файла.mp3

Для полного списка возможных флагов читай man mp3info

3) Дык google тебе в помощь. Ключевые слова: bash script arguments.
Можно почитать на русском здесь: http://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html#ARGLIST, но ничего сложного такого нет в аргументах скрипта.
Все аргументы скрипта хранятся в массиве "$@" (ещё и в "$*", но этим лучше не пользоваться). Нумерация элементов начинается с 1, т.е. первый аргумент скрипта $1 и т.д. Имя скрипта хранится в переменной "$0", количество аргументов в"$#". Вот тебе маленький пример с использованием петли, switch-case, и if (запусти к примеру с аргументами foo hello bar и думаю всё поймёшь):

text

#!/bin/bash

echo 'имя скрипта: ' $0 echo 'кол-во аргументов: ' $#

for arg in "$@"; do echo $arg #выводим каждый аргумент в новой строке done

for arg in "$@"; do case $arg in foo) echo 'аргумент - foo';; bar) echo 'аргумент - bar';; *) echo 'аргумент и не foo и не bar';; esac done

if [ "$1" = "foo" ]; then echo 'первый аргумент является foo' fi

#57158

Спасибо. Попробую.

#57162
Aspedin написал:
1.Как отрезать имя файла от типа. Т.е. от file_name.mp3 отрезать file_name

ну уже привели скрипт. только добавлю, что в современных OS нет никакого "типа" - есть просто имя. Некую часть имени многие считают за расширение, для ускорения обработки.

Добавлю, что если ваше имя УЖЕ лежит в переменной bash, то использовать sed нет никакой необходимости:

text
doc@bx:~$ x="test_file.1233.mp3"
doc@bx:~$ echo ${x%%.mp3}
test_file.1233

подробнее man bash

Aspedin написал:
2.Если вывод mp3info, вырезать выделенные части
text
File: 11 - Зима.mp3
Title:   Зима                           Track: 11
Artist:  Буготак
Album:   Человек из тайги               Year:  2007
Comment:                                Genre: Ethnic [48]

выдираем номер трека:

text
$ sed -rn 's/.*Track:\s*([0-9]+).*/\1/p'

подробности в
man sed
info sed

Aspedin написал:
3.Реализация флагов(-a,-b,-c...)в bash
Слышал про $@ но нужна конкретная ссылка

именно реализация? тогда Source Code. Иначе man bash.

#57215

1)

echo ${x%%.mp3}
Я же писал, что не делаю никаких предположений про расширение. Если знать суффикс, то действительно этот вариант более правильный.

2)
$ sed -rn 's/.*Track:\s*([0-9]+).*/\1/p'
А теперь таким же способом выдери название альбома. Регулярные выражение это конечно сильный инструмент, но всё же здесь мой способ более верный wink Не, ну действительно, нафига делать вывод _всей_ инфы, а потом парсить, кода тем же инструментом можно задать вывод определённых полей?

3)
Иначе man bash.
А это самое правильное, что ты написал smile
#57219

sKwa, Флаги и аргументы это немного разные вещи. Аргументы должны быть всегда а флаги по желанию пользователя.

#57222

Немного не понял что ты имеешь ввиду?

Кажется я понял. Ты кое-что путаешь, флаги - это те же аргументы. wink

Вот маленький пример скрипта. Если задать аргумент "-с" или "--color" вывод будет красным, но скрипт работает с успехом и без этого "флага"

#57240

sKwa, Эм ну например ls -1
-1 это флаг.

#57245

Во первых ls это _не_ скрипт, во вторых повторюсь, с точки зрения программирования флаг и аргумент это тоже самое

Вот пример моего скрипта:

text
#!/bin/bash

COLOR=""

for arg in "$@"; do if [ "$arg" = "-c" -o "$arg" = "--color" ]; then #если есть аргумент "-c" || "--color" COLOR="\e[1;31m" #то задаём красный цвет для вывода fi done

echo -e "$COLORРаботает как флаг?"

Как видишь, я не задавал разный вывод для отдельных аргументов, просто если присутствует соответствующий аргумент я задаю цвет вывода через локальную переменную

#57249
sKwa написал:
с точки зрения программирования флаг и аргумент это тоже самое

Я немного несогласен. Флаг - это как раз из Вашего примера, а аргумент обычно при указании его в командной строке имеет некое значение, присваеваемое переменной внутри скрипта или программы

#57251

Ну ребята... обязательно тыкать в специально допущенные опущения? Обязательно показать что умный как утка? Ведь человек новичок.

#57306

sKwa, я не оспаривал ваш пост, а только дополнил его.
а название альбома я выдеру, не переживайте ;)
хотя на практике я юзаю ваш способ :)

#57360
sKwa написал:
@Aspedin кажется до меня допёрло, что ты имел ввиду cool :

опять маленькое дополнение ;)

man getopt

#57371

Ага, поправка принимается :D
Я просто уже привык, что многие игнорируют man (да что там лукавить, я и сам не всё понимаю из man), поэтому прошу google дать справку на русском :P

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