cppmm 19.06.2009 00:15
Скрипты — Пример скрипта с параметрами.
Роясь на просторах винта нашёл один старый скриптик. писался он во времена, когда я не признавал ничего кроме fluxbox и консоли. Основное назначение - запись дисков из консоли. Но это не важно.Вспомнился мне этот скрипт, когда его у себя нашёл потому, что из-за способа обработки парметров, принимаемых скриптом(т.е. -h - помощь, -d - директория и т.д.) пришлось как-то поковырять документацию. В принципе, ничего сложного и всё максимально упрощено, но может кому и пригодится подход.
В самом скрипе используется два подхода - приём команды и приём опций. Ну и плюс для совсем уж новичков - работа с функциями.
P.S. Если вдруг кто захочет использовать этот скрипт в реальной жизни, он не умеет писать dvd(man cdrecord). Просто у меня в те времена не было пишущего dvd. :)
о! точно :) проглядели как-то. Думаю у автора нет веских причин, по которым этот пост нужно было бы оставить в персональном блоге.
хм... Вот честно, выбирал же блок "Скрипты на bash", когда постил. Странно, почему не выбралось.
Да ничего, со всяким бывает. Нам перенести несложно, а вам продолжать писать =)
Кажется, я понял почему так вышло - наверняка вы действительно запостили изначально именно в блог "Скрипты на bash", вот только когда я правил с катом я сам не состоял в этом блоге. Система попыталась честно выставить правильный блог, и выставила что попало, потому что того что надо не было.
Так что тут моя вина.
Так что тут моя вина.
Вернуться бы на несколько лет назад, спросить, почему не getopts, было бы интересно. :) Я же говорю, что здесь просто один из вариантов. Просто тогда, помню, недели две над этим бился.
Я кстати за то чтобы выкладывать сюда всякие скрипты, с их обсуждением и допиливанием. Соглась, прогресс бы сразу бы виден был! =)
А у нас тоже лабы были по СПО в универе, с подобными скриптами...
А у нас тоже лабы были по СПО в универе, с подобными скриптами...
Кстати да, очень полезно было бы.
Вот тут нехватает, например, задания утилиты записи через переменную - по опыту знаю, что не у всех wodim слинкован на cdrecord. Так что было бы интересно добавить какую-то опцию, что ли. Или, может быть даже проверку.
Вот тут нехватает, например, задания утилиты записи через переменную - по опыту знаю, что не у всех wodim слинкован на cdrecord. Так что было бы интересно добавить какую-то опцию, что ли. Или, может быть даже проверку.
Вот вот! Жаль я совсем уж дрянной кодер, я даже баш весьма посредственно знаю, но насмотревшись на обсуждения я бы полюбому бы научился полезному, что есть мэйнтаргет одна из главных целей ресурса.
Проверку добавить можно. Это довольно легко. Если нужно, могу сделать пример, но в Debian даже в те времена в этом не было надобности.
Возможно, было бы полезно. Но лично мне сложно понять, что стоит выкладывания, а что нет. Ведь всё здесь очень просто и понятно. :)
Скрипт хорош. Было бы неплохо пояснить некоторые аспекты, например что значит
until < -z $1 >
Почему здесь указан "первый параметр" (я не силен в скриптах, может быть $1 значит не совсем первый параметр, а что-то другое), и зачем там -z?
until < -z $1 >
Почему здесь указан "первый параметр" (я не силен в скриптах, может быть $1 значит не совсем первый параметр, а что-то другое), и зачем там -z?
< -z $var > проверяет, присутствует ли параметр $var. Если подробнее, то конструкция until < -z $var > означает по-русски "пока есть параметр $var, делать". Если параметра нет, цикл завершается.
А $1 используется так, как надо. Смотреть надо на команду shift. Она сдвигает принимаемые скриптом параметры командной строки. Т.е. если я скажу ./script.sh var1 var2, то по умолчанию, var1 - это $1, а var2 - $2. Но если в скрипте после приёма $1, дать команду shift, то для него $1 станет равен var2. Проще говоря, идёт сдвиг вправо, а самый левый параметр отбрасывается.
P.S. Не уверен, что я могу объяснить лучше, чем ABS Guide. :)
А $1 используется так, как надо. Смотреть надо на команду shift. Она сдвигает принимаемые скриптом параметры командной строки. Т.е. если я скажу ./script.sh var1 var2, то по умолчанию, var1 - это $1, а var2 - $2. Но если в скрипте после приёма $1, дать команду shift, то для него $1 станет равен var2. Проще говоря, идёт сдвиг вправо, а самый левый параметр отбрасывается.
P.S. Не уверен, что я могу объяснить лучше, чем ABS Guide. :)
Не читая манов интуитивно вроде бы начинаю понимать, что опция -z проверяет "на вшивость" параметр, и если параметр задан неверно (то есть если такого файла нет или параметра просто не задано), то возвращает положительный результат (1, true или что там еще). При этом $1 это первый (а может просто единственный?) параметр, который есть на входе и он постоянно передвигается командой shift.
А вот в функции f_write_iso() - там первые три строчки проверяют заданы ли параметры. Мне интересно - если они не заданы, то проверка ведь просто выдаст предупреждение, тогда как при заданном параметре v_help функция должна наткнуться на exit 0 и выйти. Так вот - если не задать устройство записи, например, то что будет? cdrecord будет-таки вызван или скрипт сам прервется?
А вот в функции f_write_iso() - там первые три строчки проверяют заданы ли параметры. Мне интересно - если они не заданы, то проверка ведь просто выдаст предупреждение, тогда как при заданном параметре v_help функция должна наткнуться на exit 0 и выйти. Так вот - если не задать устройство записи, например, то что будет? cdrecord будет-таки вызван или скрипт сам прервется?
Если не задать какой-нибудь из параметров, функция f_var_check() выведет справку(v_help()) и выйдет из программы(exit 0 в v_help()). Т.е. при нехватки любого из параметров(кроме скорости записи, для которого существует значение по умолчанию) скрипт не вызывает cdrecord и выходит.
Это собственно то, что будет делать скрипт. Проще говоря, вызов одной из функций, описанных в самом первом case.
А чем обусловлено использование case в #Определении действия и "тысячи" if`ов в #Определение параметров?
Разве нельзя использовать case и в определении параметров? Там же только $1 проверяется
Разве нельзя использовать case и в определении параметров? Там же только $1 проверяется
Даже если бы было одинаково в обоих вариантах ценность данного скрипта в освещении различных подходов. Конечно, скорее всего автор просто по незнанию (на тот момент) или из-за определенного положения звезд использовал именно такую комбинацию, но все же этот скрипт в качестве учебного пособия, некоего стартапа для новичка будет лучше именно в таком виде.
А если вы попытались как раз обратиться к проблеме оптимизации и доработки скриптов, о которой говорилось выше - то вопрос интересный. Возможно, с case скрипт выглядел бы действительно элегантнее и читался бы удобнее.
А если вы попытались как раз обратиться к проблеме оптимизации и доработки скриптов, о которой говорилось выше - то вопрос интересный. Возможно, с case скрипт выглядел бы действительно элегантнее и читался бы удобнее.
Конечно, скорее всего автор просто по незнанию (на тот момент) или из-за определенного положения звезд использовал именно такую комбинацию
Это вряд ли (даже без ответа автора ниже), ибо в двух других случаях использовался case =)
А пособие хорошее)
case выбирает одно из значений и продолжает выполнение скрипта дальше после esac. Мне же надо было проверить все заданные параметры командной строки, используя shift. Поэтому было выбрано некрасивое решение с тысячью if'ами.
Честно говоря, даже сейчас этот способ видится простейшим выбором для меня. )
Честно говоря, даже сейчас этот способ видится простейшим выбором для меня. )
Есть еще команда getopt для использования в подобных скриптах.
а скрипт хороший :)
а скрипт хороший :)
Выше я говорил, что тогда я не знал про getopt и изобретал велосипед. :)
Спасибо за "хорошесть". :)
Спасибо за "хорошесть". :)
Точно - комментарии по диагонали смотрел.
А велосипед замечательная штука, чем чаще изобретаешь, тем больше потом понимания и удовольствия от узнавания уже существующих решений.
А велосипед замечательная штука, чем чаще изобретаешь, тем больше потом понимания и удовольствия от узнавания уже существующих решений.
Кстати похожий по назначению код, но слегка элегантней (взято без изменений из /etc/init.d/network в SUSE):
while < $# -gt 0 >; do
case $1 in
boot|onboot) MODE=onboot ;;
hotplug) MODE=hotplug ;;
manual) MODE=manual ;;
check) CHECK=check ;;
quiet) be_quiet_has_gone ;;
debug) DEBUG=yes ;;
type=*) TYPE=${1#type=} ;;
fake) FAKE=echo ;;
skip=*) SKIP=${1#skip=} ;;
nm) NETWORKMANAGER=yes ;;
netcontrol) NETWORKMANAGER=no ;;
localfs) FS_FILTER=localfs ;;
remotefs) FS_FILTER=remotefs ;;
*) mesg "Unknown option '$1'"
mesg "options: {boot,hotplug,manual,check,debug,type=<typelist>,fake,localfs)"
exit 1 ;;
esac
shift
done
куски кода вставляются с помощью тега code, а не color. Поправил, но будьте внимательнее в следующий раз
кстати, что-то было не так в тексте скрипта строке в 17 - заканчивалось на угловую скобку. Уверен что правильно было бы дописать там еще какие-то значения, да вот незнаю какие, поэтому просто закрыл скобку и кавычки - без них скрипт оставался красным из-за битого синтаксиса.
Каты в таких постах не забываем! Поправил.