помогите разобраться с shell-скриптом (небольшой непонятный код)
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 8
помогите разобраться с shell-скриптом
Всем привет!!!
Я в Линуксе мало что понимаю, но охота понимать.
Мне надо файл создать, а в нем следующее прописать:
#!/bin/sh
PRN_BIN=/usr/local/sbin/usb_printerid
PRN_FRM=/usr/local/sbin/*МОДЕЛЬ ВАШЕГО ПРИНТЕРА*.dl
if [ "$ACTION" = "add" ] || [ "$1" = "usb" ] || [ "$DEVFS" = "/proc/bus/usb" ]; then
sleep 5
$PRN_BIN /dev/usb/lp0 | grep -q FWVER || cat $PRN_FRM > /dev/usb/lp0
fi
killall hotplug.sh
У меня вопросы:
Я так понимаю:
1)#!/bin/sh - это то, что будет исполнять этот файл. Зачем тогда #! ?????
2) PRN_BIN=/usr/local/sbin/usb_printerid - это переменная
PRN_FRM=/usr/local/sbin/*МОДЕЛЬ ВАШЕГО ПРИНТЕРА*.dl - это тоже переменная
if [ "$ACTION" = "add" ] || [ "$1" = "usb" ] || [ "$DEVFS" = "/proc/bus/usb" ]; then - это условие (эта строка мне полностью непонятна)
sleep 5 - ждать 5 секунд (правда непонятно зачем)
$PRN_BIN /dev/usb/lp0 | grep -q FWVER || cat $PRN_FRM > /dev/usb/lp0 (эта тоже непонятна)
fi - конец
killall hotplug.sh - это понятно
Пожалйуства побольще объяснений. Заранее спасибо!
Я в Линуксе мало что понимаю, но охота понимать.
Мне надо файл создать, а в нем следующее прописать:
#!/bin/sh
PRN_BIN=/usr/local/sbin/usb_printerid
PRN_FRM=/usr/local/sbin/*МОДЕЛЬ ВАШЕГО ПРИНТЕРА*.dl
if [ "$ACTION" = "add" ] || [ "$1" = "usb" ] || [ "$DEVFS" = "/proc/bus/usb" ]; then
sleep 5
$PRN_BIN /dev/usb/lp0 | grep -q FWVER || cat $PRN_FRM > /dev/usb/lp0
fi
killall hotplug.sh
У меня вопросы:
Я так понимаю:
1)#!/bin/sh - это то, что будет исполнять этот файл. Зачем тогда #! ?????
2) PRN_BIN=/usr/local/sbin/usb_printerid - это переменная
PRN_FRM=/usr/local/sbin/*МОДЕЛЬ ВАШЕГО ПРИНТЕРА*.dl - это тоже переменная
if [ "$ACTION" = "add" ] || [ "$1" = "usb" ] || [ "$DEVFS" = "/proc/bus/usb" ]; then - это условие (эта строка мне полностью непонятна)
sleep 5 - ждать 5 секунд (правда непонятно зачем)
$PRN_BIN /dev/usb/lp0 | grep -q FWVER || cat $PRN_FRM > /dev/usb/lp0 (эта тоже непонятна)
fi - конец
killall hotplug.sh - это понятно
Пожалйуства побольще объяснений. Заранее спасибо!
-
- Сообщения: 1913
- Статус: zzz..z
-
- Сообщения: 1445
- ОС: Debian Squeeze
Re: помогите разобраться с shell-скриптом
Строка #!/bin/sh есть для того, чтобы система поняла, чем она должна исполнять скрипт. Если написать без #! то система просто выполнит команду /bin/sh вместо того, чтобы использовать /bin/sh в качестве интерпретатора.
-
- Сообщения: 8
Re: помогите разобраться с shell-скриптом
Так с интерпритатором понятно, а вот ACTION нигде не могу найти, даже в ваших ссылках
-
- Сообщения: 1095
- Статус: -
- ОС: GNU/Linux
Re: помогите разобраться с shell-скриптом
это имя переменной
-
- Сообщения: 1913
- Статус: zzz..z
Re: помогите разобраться с shell-скриптом
значение переменной $ACTION есть add
или
входной параметр скрипта ($1) есть usb
или
значение переменной $DEVFS есть /proc/bus/usb
[x] close
-
- Сообщения: 331
- ОС: :OC
Re: помогите разобраться с shell-скриптом
man test
|| = ИЛИ. тоесть если выполняется одно из условий в данном примере.
для инициализации принтера, скорее всего.
$PRN_BIN /dev/usb/lp0 | grep -q FWVER - выцепляем данные о принтере, | = перенаправление вывода. грепаем по строке, если находим указанную строку - ниче не делаем. если не находим - выполняется вторая часть cat $PRN_FRM > /dev/usb/lp0, что помоему бред =) скорее должно быть && чтобы в случае наличия FWVER прошивка в принтер заливалась.
как понимаю вещается в скрипты udev?
кстати, в нормальных дистрах все это уже работает изкаробки после установки foo2zjs
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: помогите разобраться с shell-скриптом
нет
X || Y || Z
выполняется X, и
если X завершилось с ошибкой - Y,
если Y тоже с ошибкой - Z
("с ошибкой" в данном случае - команда вернула НЕ НУЛЬ, это бывает если в правду была ошибка, либо условие не верное ("$ACTION" != "add"))
boobo вам ссылочки дали, почитайте. там всё написано.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: помогите разобраться с shell-скриптом
скрипт то-ли неполный, то-ли...
FWVER наверное имя скрипта
grep -q проверяет, нет ли уже такого скрипта в работе. и если таких скриптов нету, то в принтер заливается прошивка.
-
- Сообщения: 331
- ОС: :OC
Re: помогите разобраться с shell-скриптом
здесь идет проверка условий []. и в данном случае проверяются возвраты команд тест (тру\фэлс). здесь логическое ИЛИ Булевая алгебра
чета у вас с телепатией туго.
Код: Выделить всё
butch@anton-f:~$ sudo usb_printerid /dev/usb/lp0
[sudo] password for butch:
GET_DEVICE_ID string:
MFG:Hewlett-Packard;MDL:HP LaserJet 1018;CMD:ACL;CLS:PRINTER;DES:HP LaserJet 1018;FWVER:20051028;
-
- Сообщения: 8
Re: помогите разобраться с shell-скриптом
Дак я понимаю, что там проверка и инициализация принтера. Я не понимаю, что значит ACTION. Что дает нам проверка ACTIOn = add. Это проверка на то воткнул ли я принтер что ли?
И зачем мы стваим &, если до этого мы для двух переменных ничего не делали. И раз переменную ADD я нигде не вводил, значит она встроеная? А что она значит то?
И зачем мы стваим &, если до этого мы для двух переменных ничего не делали. И раз переменную ADD я нигде не вводил, значит она встроеная? А что она значит то?
-
- Сообщения: 1913
- Статус: zzz..z
Re: помогите разобраться с shell-скриптом
Выкладывайте тогда откуда у вас информация что
и как вы будете его затем использовать... предполагаю что это как-то связано с правилами udev
почему вы решили что это переменная??!
Короче, колитесь откуда вы взяли этот скрипт?
[x] close
-
- Сообщения: 8
Re: помогите разобраться с shell-скриптом
у меня есть точка доступа, но не работает прнтер с ней, вот я и поспрашал:
http://wl500g.info/showthread.php?t=19915
http://wl500g.info/showthread.php?t=19915
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: помогите разобраться с shell-скриптом
понятно, что это булева алгебра. я просто обращаю внимание на тот факт, что части выражения вовсе не все выполняются, тут три команды [, и в зависимости от результатов, выполняются не все 3, 1 ИЛИ 2 ИЛИ 3 этих команды. ИМХО это ОЧЕНЬ важно для понимания работы скрипта.
дело в том, что в обычной алгебре(в т.ч. и булевой) всегда выполняются ВСЕ части выражения, а вот в этой - только некоторые.
про телепатию: да, не сообразил. нету у меня принтера под рукой...
-
- Сообщения: 1913
- Статус: zzz..z
-
- Сообщения: 331
- ОС: :OC
Re: помогите разобраться с shell-скриптом
boobo писал(а): ↑02.07.2009 14:59у меня есть точка доступа, но не работает прнтер с ней, вот я и поспрашал:
http://wl500g.info/showthread.php?t=19915
там же все разжевано!
неправильно.drBatty писал(а): ↑02.07.2009 15:01части выражения вовсе не все выполняются, тут три команды [, и в зависимости от результатов, выполняются не все 3, 1 ИЛИ 2 ИЛИ 3 этих команды. ИМХО это ОЧЕНЬ важно для понимания работы скрипта.
дело в том, что в обычной алгебре(в т.ч. и булевой) всегда выполняются ВСЕ части выражения, а вот в этой - только некоторые.
это if then. между ними идет условие, если оно тру - будет выполняться последующий после then код.
чтобы было яснее, для if then это выглядит так:
if true || false || false then
тоесть в случае || (ИЛИ) если одно из тру - будем выполняться.
именно это присутвует в скрипте.
и никак это не значит что если первое false, то второе мы не выполняем.
кнчно же нужно признать, что || и && - это связка команд по цепочкам на основе кода возврата. но не в случае проверки условия в if then
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: помогите разобраться с shell-скриптом
butch писал(а): ↑02.07.2009 15:22boobo писал(а): ↑02.07.2009 14:59у меня есть точка доступа, но не работает прнтер с ней, вот я и поспрашал:
http://wl500g.info/showthread.php?t=19915
там же все разжевано!
неправильно.drBatty писал(а): ↑02.07.2009 15:01части выражения вовсе не все выполняются, тут три команды [, и в зависимости от результатов, выполняются не все 3, 1 ИЛИ 2 ИЛИ 3 этих команды. ИМХО это ОЧЕНЬ важно для понимания работы скрипта.
дело в том, что в обычной алгебре(в т.ч. и булевой) всегда выполняются ВСЕ части выражения, а вот в этой - только некоторые.
это if then. между ними идет условие, если оно тру - будет выполняться последующий после then код.
чтобы было яснее, для if then это выглядит так:
if true || false || false then
тоесть в случае || (ИЛИ) если одно из тру - будем выполняться.
именно это присутвует в скрипте.
и никак это не значит что если первое false, то второе мы не выполняем.
кнчно же нужно признать, что || и && - это связка команд по цепочкам на основе кода возврата. но не в случае проверки условия в if then
if/then вообще к этому не имеет отношения.
Код: Выделить всё
true || [...]
в этом коде [...] ВООБЩЕ НЕ БУДЕТ ВЫПОЛНЯТСЯ. попробуйте сами. например
Код: Выделить всё
echo "test" || echo "AAA"
как видите - выводится только "test". потому-что echo "AAA" просто игнорируется.
PS: если первое - труЪ - остальное выполнять нет никакого смысла, это-же ИЛИ. такая логика создателей bash(впрочем как и си)
удобно например в таком случае:
Код: Выделить всё
команда_которая_иногда_ошибается || { echo "Возникла ошибка $?"; exit 68; }
тут в случае ошибки печатается сообщение, и скрипт прерывает свою работу.
или ещё пример, теперь с &&
Код: Выделить всё
./configure && make && make install
тут выполняется скрипт configure, и ЕСЛИ небыло ошибок выполняется make, и ЕСЛИ небыло ошибок выполняется make install.
Зачем нужны if/then?

-
- Сообщения: 8
Re: помогите разобраться с shell-скриптом
Команде qrep нужен входной поток, а тут их два что ли?
/usr/local/sbin/usb_printerid /dev/usb/lp0 | grep -q FWVER
и с каким она будет работать или с двумя, т.е. она ищет совпадение в двух файлах. а тогда какое выолнятеся условие: совпало 1 И 2, 1 или 2?
и почему иногда ставят >
а иногда >>
почему иногда для if ставят []
/usr/local/sbin/usb_printerid /dev/usb/lp0 | grep -q FWVER
и с каким она будет работать или с двумя, т.е. она ищет совпадение в двух файлах. а тогда какое выолнятеся условие: совпало 1 И 2, 1 или 2?
и почему иногда ставят >
а иногда >>
почему иногда для if ставят []
-
- Сообщения: 8
Re: помогите разобраться с shell-скриптом
И еще:
echo "# Printer" >> pre-boot - зачем значок #
echo "/bin/echo "/usr/local/sbin/hotplug.sh >> /proc/sys/kernel/hotplug" >> pre-boot - тут где-то ошибка??!
echo "# Printer" >> pre-boot - зачем значок #
echo "/bin/echo "/usr/local/sbin/hotplug.sh >> /proc/sys/kernel/hotplug" >> pre-boot - тут где-то ошибка??!
-
- Сообщения: 427
- Статус: Zz
- ОС: Calculate
Re: помогите разобраться с shell-скриптом
> - создаст новый файл
>> - добавит в конец файла (если нет, то создаст)
[] - man test
-
- Сообщения: 237
- Статус: Будущий математик
- ОС: Kubuntu,Ubuntu(UNR) 10.04
Re: помогите разобраться с shell-скриптом
Команде qrep нужен входной поток, а тут их два что ли?
/usr/local/sbin/usb_printerid /dev/usb/lp0 | grep -q FWVER
один... посмотрите внимательно:
при вызове программы мы указываем ее имя и аргументы через пробел. так как запись /dev/usb/lp0 отделена пробелом, то она будет воспринята как аргумент, независимо от данных, лежащих в /dev/usb/lp0. у баша нет мозга, у него есть синтаксис. Синтаксис описан в приведенных выше ссылках. Не спешите, читать нужно не по диагонали, нужно вчитываться.
и почему иногда ставят >
а иногда >>
это перенаправление ввода-вывода. первое - перезапись, второе - дозапись.
посмотрите на примере:
1)
Код: Выделить всё
ls > temp
2)
Код: Выделить всё
ls >>temp2
каждую команду выполните по пять раз и посмотрите в чем разница между файлами temp и temp2
почему иногда для if ставят []
почему вы ставите скобки в выражении (a+b)(c+d) - это про математику, операция умножения приоритетней чем сложение, та же запись без скобок даст совсем другой результат. Логические операции тоже имеют приоритеты, почитайте документацию, чтобы разобраться
Код: Выделить всё
echo "# Printer" >> pre-boot - зачем значок #
команда echo выводит свой аргумент на стандартный вывод, так как у вас перенаправление, то происходит дозапись в файл pre-boot строки "# Printer". на процесс выполнения команды echo наличие знака решетки не влияет, просто надо вот написать с решеткой и все
echo "/bin/echo "/usr/local/sbin/hotplug.sh >> /proc/sys/kernel/hotplug" >> pre-boot - тут где-то ошибка??!
судя по количеству кавычек видимо да, ошибка.
-
- Сообщения: 331
- ОС: :OC
Re: помогите разобраться с shell-скриптом
я же в личку кинул ссылку вроде? щас не полезу уже уточнять, что было раньше, этот пост или личка.
одно дело цепочки команд, другое абсолютно(!!!!) - условные операторы.
читаем:
http://gazette.linux.ru.net/rus/articles/a...3.html#ARITHOPS
ниже абзац о логических операциях!
и там же находятся примеры с этими самыми if\then!
сами пораскиньте москами. если для if нужно указать несколько условий и выполнить на основе нескольких условий лишь одну команду, вы вкладывать будете внутрь еще if\then для каждого условия??
-
- Сообщения: 8
Re: помогите разобраться с shell-скриптом
echo "if [ -w /dev/usb/lp0 ]" >> post-boot
echo "cat /usr/local/sbin/sihp1018.dl>/dev/usb/lp0" >> post-boot
- это надо понимать так: если файл существует, то пихаем все в dev/usb/lp0.
А почему тогда нельзя написать:
echo "if -w /dev/usb/lp0 " >> post-boot - БЕЗ []
echo "cat /usr/local/sbin/sihp1018.dl>/dev/usb/lp0" >> post-boot . Ведь там еще условий на проверку нет!
/usr/local/sbin/usb_printerid /dev/usb/lp0 | grep -q FWVER - дак если grep будет искать в /dev/usb/lp0, зачем тогда /usr/local/sbin/usb_printerid
echo "cat /usr/local/sbin/sihp1018.dl>/dev/usb/lp0" >> post-boot
- это надо понимать так: если файл существует, то пихаем все в dev/usb/lp0.
А почему тогда нельзя написать:
echo "if -w /dev/usb/lp0 " >> post-boot - БЕЗ []
echo "cat /usr/local/sbin/sihp1018.dl>/dev/usb/lp0" >> post-boot . Ведь там еще условий на проверку нет!
/usr/local/sbin/usb_printerid /dev/usb/lp0 | grep -q FWVER - дак если grep будет искать в /dev/usb/lp0, зачем тогда /usr/local/sbin/usb_printerid
-
- Сообщения: 427
- Статус: Zz
- ОС: Calculate
Re: помогите разобраться с shell-скриптом
[] в иф это и есть проверка. Гляньте man test.
-
- Сообщения: 8
Re: помогите разобраться с shell-скриптом
Дак, то что # не влияет на echo итак ясно (она же в ковычках), я то имел в виду для чего # в файле который я создаю
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: помогите разобраться с shell-скриптом
самый прикол в том, что [ это такая команда
запись [ X ] почти эквивалентна записи test X
скобки [...] НЕ ЯВЛЯЮТСЯ частью shell, это такие команды.
а вот
Код: Выделить всё
if УСЛОВИЕ then; ДЕЙСТВИЕ; fi
это ЧАСТЬ ЯЗЫКА bash. в качестве "УСЛОВИЕ" можно подставлять любые команды, хотя обычно используют test и [....]
например:
Shell
$ if cat /XXXXXX; then echo "всё ок"; else echo "ОШИБКА $?"; fi
cat: /XXXXXX: Нет такого файла или каталога
ОШИБКА 1
то-же самое можно переписать и не используя if/then/fi
Shell
$ cat /XXXXXX && echo "всё ок" || echo "ОШИБКА $?
cat: /XXXXXX: Нет такого файла или каталога
ОШИБКА 1
а можно ничего никуда не заворачивать, так использовать:
$
[ -f /XXXXXX ]; echo $?
1
как видите, ответ 1, что значит - false, а конкретнее - "нет такого файла"
буду. а может не буду. а может буду использовать while/continue, а может && - это от задачи зависит. связки && || объединяют КОМАНДЫ, а не условия.
-
- Сообщения: 331
- ОС: :OC
Re: помогите разобраться с shell-скриптом
вы молодец. пасиба что сообщили. а то забыл. целый день ведь прошел =)))
давайте всетаки использовать вещи правильно.
и теперь давайте вместе рассмотрим примеры, раз уж читать не хотим. надеюсь скопистить в терминал сможете? =)
логическое ИЛИ (or)
возьмем простейший пример с одним условием (представим что if проверяет тест. ведь тест всеравно вернет или true или false, ведь так? в общем опустим test)
Код: Выделить всё
if false
then
echo "ты не прав"
fi
в данном случае на экране ничего не отобразится. оно и понятно =) можете замунить false на true и удостоверится, что сообщение будет отображено.
теперь усложним задачу, допустим у нас два условия, и если одно из них верно, мы должны вывести текст. как это сделать?
видимо по логике drBatty нужно использовать вложенный if\then. но как? если в первом условии будет false - мы не проверим второе, и тогда не напечатаем текст, несмотря на то, что второе условие - верное.
вот незадача, да? =)))
теперь верный ответ для if\then
Код: Выделить всё
if true || false || false
then
echo "ты не прав"
fi
можете как угодно переставлять условие if - от этого ничего не изменится и проверятся будут все уловия по правилам булевой алгебры.
здесь условия объедены || - логическим ИЛИ. но как же, спросит drBatty, это получается?!?
ведь:
drBatty писал(а): ↑02.07.2009 19:34if/then вообще к этому не имеет отношения.
Код
true || [...]
в этом коде [...] ВООБЩЕ НЕ БУДЕТ ВЫПОЛНЯТСЯ. попробуйте сами. например
Код
echo "test" || echo "AAA"
как видите - выводится только "test". потому-что echo "AAA" просто игнорируется.
PS: если первое - труЪ - остальное выполнять нет никакого смысла, это-же ИЛИ. такая логика создателей bash(впрочем как и си)
я уже в 5 раз вам говорю: не стоит применять идею последовательного выполнения команд на основе кода возврата и логические операции. то что знаки одинаковые (|| и &&) совсем не значит что это одно и тоже.
вот про sed я бы вас послушал.
-
- Сообщения: 1913
- Статус: zzz..z
Re: помогите разобраться с shell-скриптом
Покажите где в скрипте, пероставленом вами, есть # (кроме первой строки #!/bin/sh)??? Я так понимаю по скрипту в первом посте у вас вопросов больше нет? ваша проблема решилась?
[x] close
-
- Сообщения: 427
- Статус: Zz
- ОС: Calculate
Re: помогите разобраться с shell-скриптом
test вроде как вернет код завершения. true и false это вроде как тоже команды.
Это совсем не понял, но по-моему тоже не верно.
-
- Сообщения: 331
- ОС: :OC
Re: помогите разобраться с shell-скриптом
тру возвращяет код возврата 0. фэлс - 1. и тест и тру и фэлс - команды. что вы этим хотели сказать?
Код: Выделить всё
butch@anton-f:~$ true
butch@anton-f:~$ echo $?
0
butch@anton-f:~$ false
butch@anton-f:~$ echo $?
1
И и ИЛИ - коммутативные операции
вы можете переставлять их местами - от этого итог не меняется.