Вопросы по 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
Слышал про $@ но нужна конкретная ссылка.
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 и думаю всё поймёшь):
1.Как отрезать имя файла от типа. Т.е. от file_name.mp3 отрезать file_name
ну уже привели скрипт. только добавлю, что в современных OS нет никакого "типа" - есть просто имя. Некую часть имени многие считают за расширение, для ускорения обработки.
Добавлю, что если ваше имя УЖЕ лежит в переменной bash, то использовать sed нет никакой необходимости:
Я же писал, что не делаю никаких предположений про расширение. Если знать суффикс, то действительно этот вариант более правильный.
2)
$ sed -rn 's/.*Track:\s*([0-9]+).*/\1/p'
А теперь таким же способом выдери название альбома. Регулярные выражение это конечно сильный инструмент, но всё же здесь мой способ более верный wink Не, ну действительно, нафига делать вывод _всей_ инфы, а потом парсить, кода тем же инструментом можно задать вывод определённых полей?
Кажется я понял. Ты кое-что путаешь, флаги - это те же аргументы. wink
Вот маленький пример скрипта. Если задать аргумент "-с" или "--color" вывод будет красным, но скрипт работает с успехом и без этого "флага"
Во первых 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Работает как флаг?"
Как видишь, я не задавал разный вывод для отдельных аргументов, просто если присутствует соответствующий аргумент я задаю цвет вывода через локальную переменную
с точки зрения программирования флаг и аргумент это тоже самое
Я немного несогласен. Флаг - это как раз из Вашего примера, а аргумент обычно при указании его в командной строке имеет некое значение, присваеваемое переменной внутри скрипта или программы
Ага, поправка принимается :D
Я просто уже привык, что многие игнорируют man (да что там лукавить, я и сам не всё понимаю из man), поэтому прошу google дать справку на русском :P