Re: помогите с bash и условием
On Fri, Aug 23, 2013 at 12:50:03AM +0400, Artem Chuprina wrote: Sergey Korobitsin - debian-russian@lists.debian.org @ Thu, 22 Aug 2013 20:31:31 +0600: Ну, if умеет отрицание: if ! echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO; then ... fi [...] Так что if ! echo ... ; then ... сделает нужное. SK Да, надо читать маны :-(. Я почему-то решил, что оно будет относиться к SK первой команде в пайпе. А вообще, лучше perl взять, там unless есть :-). Еще можно написать if command then : else содержательный текст fi sh-совместимо, кстати. if ! ... тоже sh- (и POSIX-)совместимо, я другого никогда не рекомендовал :) Всего лучшего, Петр -- Peter Pentchev r...@ringlet.net r...@freebsd.org p.penc...@storpool.com PGP key:http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint 2EE7 A7A5 17FC 124C F115 C354 651E EFB0 2527 DF13 I am the thought you are now thinking. signature.asc Description: Digital signature
Re: помогите с bash и условием
Peter Pentchev - debian-russian@lists.debian.org @ Fri, 23 Aug 2013 11:13:32 +0300: Еще можно написать if command then : else содержательный текст fi sh-совместимо, кстати. PP if ! ... тоже sh- (и POSIX-)совместимо, я другого никогда не рекомендовал :) Боюсь, что это POSIX-, но не sh-совместимо. В смысле, мы, кажется, ходили по этим граблям в Solaris. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87zjs8rbsq@wizzle.ran.pp.ru
Re: помогите с bash и условием
On 22.08.2013 18:33, Andrey Melnikoff wrote: Любите вы всё усложнять на пустом месте. пайпов вагон, зачем? спору нет #/bin/sh TO=/dev/sdb SERIAL=RTF57NGH if [ $(udevadm info --query=all -n ${TO} | grep -c SERIAL_SHORT=${SERIAL}) != 1 ]; then echo blah-blah fi ы? ) спасибо -- С Уважением, специалист по техническому и программному обеспечению, системный администратор Скубриев Владимир ~~~ Россия, Ростовская область, г. Таганрог тел. моб: +7 (918) 504 38 20 skype: v.skubriev icq: 214-800-502 www: skubriev.ru -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/52172d8e.8050...@skubriev.ru
Re: помогите с bash и условием
16:53 Thu 22 Aug, Владимир Скубриев wrote: On 22.08.2013 16:43, Andrey Tataranovich wrote: 14:35 Thu 22 Aug, Владимир Скубриев wrote: TO=/dev/sdb SERIAL=RTF57NGH TO_DISK_INFO=`udevadm info --query=all -n $TO` echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO # проверяем результат последней команды if [ $? -ne 0 ]; then echo Parametr SERIALTO do not correspond hard drive TO - Exiting, beacuse we cannot delete ALL DATA ... echo ... !!! BE Careful !!! ... exit 3 fi Проверить наличие нужного диска можно проще: BACKUP_DISK=/dev/disk/by-id/usb-Easy_Disk_AA040127_007375-0:0 if [ ! -b $BACKUP_DISK ]; then echo Correct backup disk not found: $BACKUP_DISK 2 exit 1 fi Я стремился к универсальности, вот: #!/bin/bash FROM=$1 TO=$2 SERIALTO=$3 TO_DISK_INFO=`udevadm info --query=all -n $TO` if [ ! $# == 3 ]; then echo Usage: FROM TO SERIALNUMBER_OF_DISK_TO exit 1 fi if [[ ! -b $2 ]] || [[ ! -b $1 ]]; then echo First | Second parametr is not a valid Block device exit 2 fi echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO if [ $? -ne 0 ]; then echo Parametr SERIALTO do not correspond hard drive TO - Exiting, beacuse we cannot delete ALL DATA ... exit 3 fi echo $TO_DISK_INFO | grep ID_BUS | grep -qi usb if [ $? -ne 0 ]; then echo This disk is not USB Backup Disk - Exiting, beacuse we cannot delete ALL DATA ... exit 4 fi Ваш вариант сложнее. В моем варианте проверяется все необходимое, чтобы не стереть неверный диск. И константу BACKUP_DISK можно сразу использовать в скрипте вместо /dev/sd?. -- WBR, Andrey Tataranovich -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20130823115155.ge12...@tataranovich-pc.local.aitoc.com
помогите с bash и условием
есть команда, точнее набор команд echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO if [ ОТРИЦАНИЕ + УСЛОВИЕ ]; then echo ERROR exit 3 fi Мне необходимо условие с отрицанием и желательно чтобы все было помещено в блок if [ ... ], т.е. в одну строку - желательно но не обязательно. Т.е. когда мой набор команд выполнен не успешно, то срабатывало то, что в блоке then иначе скрипт продолжал работать дальше Ни как не могу так сделать. Я не знаю как правильно написать выражение и добавить к нему отрицание. Спасибо. -- С Уважением, специалист по техническому и программному обеспечению, системный администратор Скубриев Владимир ~~~ Россия, Ростовская область, г. Таганрог тел. моб: +7 (918) 504 38 20 skype: v.skubriev icq: 214-800-502 www: skubriev.ru
Re: помогите с bash и условием
Владимир Скубриев ☫ → To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 14:23 +0400 есть команда, точнее набор команд echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO if [ ОТРИЦАНИЕ + УСЛОВИЕ ]; then echo ERROR exit 3 fi Мне необходимо условие с отрицанием и желательно чтобы все было помещено в блок if [ ... ], т.е. в одну строку - желательно но не обязательно. Т.е. когда мой набор команд выполнен не успешно, то срабатывало то, что в блоке then иначе скрипт продолжал работать дальше echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO if [ $? -ne 0 ]; then echo ERROR exit 3 fi А что в $TO_DISK_INFO? Можно оптимизировать. -- Bright regards, Sergey Korobitsin, Chief Research Officer Arta Software, http://arta.kz/ xmpp:underta...@jabber.arta.kz -- Технология ведет нас к сценарию, где капиталистический метод производства будет побежден и с течением времени заменен другим. В наших руках ростки будущих ролей, не признающие рыночных отношений. -- Mikhail, автор бразильской локализации Гнутеллы. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20130822102807.gd...@undertaker.dev.lan.arta.kz
Re: помогите с bash и условием
Sergey Korobitsin ☫ → To debian-russian@lists.debian.org @ Thu, Aug 22, 2013 16:28 +0600 помещено в блок if [ ... ], т.е. в одну строку - желательно но не обязательно. Вариантов масса, на самом деле, например, вот: die () { echo ERROR exit 3 } echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO || die -- Bright regards, Sergey Korobitsin, Chief Research Officer Arta Software, http://arta.kz/ xmpp:underta...@jabber.arta.kz -- ...Когда я увидел перед собой перспективу жизни, прожитой так же, как живет весь мир, я решил - ни за что, это отвратительно, мне будет стыдно самого себя. Если бы я участвовал в поддержке этой системы отчужденного, собственнического программирования, мне казалось бы, что я делаю мир хуже ради денег. -- Ричард М. Столлман (из интервью) -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20130822103314.ge...@undertaker.dev.lan.arta.kz
Re: помогите с bash и условием
On 22.08.2013 14:28, Sergey Korobitsin wrote: Владимир Скубриев ☫ → To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 14:23 +0400 есть команда, точнее набор команд echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO if [ ОТРИЦАНИЕ + УСЛОВИЕ ]; then echo ERROR exit 3 fi Мне необходимо условие с отрицанием и желательно чтобы все было помещено в блок if [ ... ], т.е. в одну строку - желательно но не обязательно. Т.е. когда мой набор команд выполнен не успешно, то срабатывало то, что в блоке then иначе скрипт продолжал работать дальше echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO if [ $? -ne 0 ]; then echo ERROR exit 3 fi А что в $TO_DISK_INFO? Можно оптимизировать. TO=/dev/sdb SERIAL=RTF57NGH TO_DISK_INFO=`udevadm info --query=all -n $TO` echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO # проверяем результат последней команды if [ $? -ne 0 ]; then echo Parametr SERIALTO do not correspond hard drive TO - Exiting, beacuse we cannot delete ALL DATA ... echo ... !!! BE Careful !!! ... exit 3 fi Проверил не работает я так уже пробывал. Результат команды проверял = 0 , через echo $? P.S. $? - результат последней команды Пробывал также if [ $? -ne 1 ]; if [ ! $? -ne 1 ]; не работает. -- С Уважением, специалист по техническому и программному обеспечению, системный администратор Скубриев Владимир ~~~ Россия, Ростовская область, г. Таганрог тел. моб: +7 (918) 504 38 20 skype: v.skubriev icq: 214-800-502 www: skubriev.ru -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/5215e96c.1010...@skubriev.ru
Re: помогите с bash и условием
On 22.08.2013 14:33, Sergey Korobitsin wrote: Sergey Korobitsin ☫ → To debian-russian@lists.debian.org @ Thu, Aug 22, 2013 16:28 +0600 помещено в блок if [ ... ], т.е. в одну строку - желательно но не обязательно. Вариантов масса, на самом деле, например, вот: die () { echo ERROR exit 3 } echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO || die Ну как вариант, только мне кажется нагроможденней получается -- С Уважением, специалист по техническому и программному обеспечению, системный администратор Скубриев Владимир ~~~ Россия, Ростовская область, г. Таганрог тел. моб: +7 (918) 504 38 20 skype: v.skubriev icq: 214-800-502 www: skubriev.ru -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/5215ea8b.9030...@skubriev.ru
Re: помогите с bash и условием
On 22.08.2013 14:28, Sergey Korobitsin wrote: Владимир Скубриев ☫ → To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 14:23 +0400 есть команда, точнее набор команд echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO if [ ОТРИЦАНИЕ + УСЛОВИЕ ]; then echo ERROR exit 3 fi Мне необходимо условие с отрицанием и желательно чтобы все было помещено в блок if [ ... ], т.е. в одну строку - желательно но не обязательно. Т.е. когда мой набор команд выполнен не успешно, то срабатывало то, что в блоке then иначе скрипт продолжал работать дальше echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO if [ $? -ne 0 ]; then echo ERROR exit 3 fi А что в $TO_DISK_INFO? Можно оптимизировать. Извиняюсь. работает! Это я уже просто запутался не тот серийник подсовывал. Большое спасибо. -- С Уважением, специалист по техническому и программному обеспечению, системный администратор Скубриев Владимир ~~~ Россия, Ростовская область, г. Таганрог тел. моб: +7 (918) 504 38 20 skype: v.skubriev icq: 214-800-502 www: skubriev.ru -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/5215ee13.3010...@skubriev.ru
Re: помогите с bash и условием
Владимир Скубриев ☫ → To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 14:35 +0400 On 22.08.2013 14:28, Sergey Korobitsin wrote: TO=/dev/sdb SERIAL=RTF57NGH TO_DISK_INFO=`udevadm info --query=all -n $TO` echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO А кто такой $SERIALTO? Что-то не вижу его объявления. А если его нет, то в grep -q подставится пустая строка, и он всегда будет выдавать 0. -- Bright regards, Sergey Korobitsin, Chief Research Officer Arta Software, http://arta.kz/ xmpp:underta...@jabber.arta.kz -- А у меня мой стул укатил кто-то. Он был помечен на правой ручке моей белой нашейной ленточкой от флешки Transcend. Фиг с ним, со стулом, ленточку жалко -- mirat @ https://projects.arta.local/forum/message.php?msg_id=173 -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20130822105720.gf...@undertaker.dev.lan.arta.kz
Re: помогите с bash и условием
On 22.08.2013 14:57, Sergey Korobitsin wrote: Владимир Скубриев ☫ → To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 14:35 +0400 On 22.08.2013 14:28, Sergey Korobitsin wrote: TO=/dev/sdb SERIAL=RTF57NGH TO_DISK_INFO=`udevadm info --query=all -n $TO` echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO А кто такой $SERIALTO? Что-то не вижу его объявления. А если его нет, то в grep -q подставится пустая строка, и он всегда будет выдавать 0. он просто раньше задается ) серийник винта на который бэкапить это скрипт автоматического бэкапа на usb винт -- С Уважением, специалист по техническому и программному обеспечению, системный администратор Скубриев Владимир ~~~ Россия, Ростовская область, г. Таганрог тел. моб: +7 (918) 504 38 20 skype: v.skubriev icq: 214-800-502 www: skubriev.ru -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/5215f100.9090...@skubriev.ru
Re: помогите с bash и условием
On Thu, Aug 22, 2013 at 02:55:15PM +0400, Владимир Скубриев wrote: On 22.08.2013 14:28, Sergey Korobitsin wrote: Владимир Скубриев ☫ → To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 14:23 +0400 есть команда, точнее набор команд echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO if [ ОТРИЦАНИЕ + УСЛОВИЕ ]; then echo ERROR exit 3 fi Мне необходимо условие с отрицанием и желательно чтобы все было помещено в блок if [ ... ], т.е. в одну строку - желательно но не обязательно. Т.е. когда мой набор команд выполнен не успешно, то срабатывало то, что в блоке then иначе скрипт продолжал работать дальше echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO if [ $? -ne 0 ]; then echo ERROR exit 3 fi А что в $TO_DISK_INFO? Можно оптимизировать. Извиняюсь. работает! Это я уже просто запутался не тот серийник подсовывал. Большое спасибо. Немножко идей: 1. Заключайте $varname в , чтоб шелу не вздумалось разбить значение 'varname' на отдельных слов. Я-то заключаю всегда, не мешает, быстро привикнул. 2. command; if [ $? -eq 0 ] точно то же самое как if command. Так что: if echo $TO_DISK_INFO | grep $SERIAL_SHORT | grep -q $SERIALTO; then ... fi 3. Я никогда не использую grep, всегда использую или egrep, или fgrep: - fgrep быстрее для фиксированных низов - fgrep не интерпретирует специальных символов - ., [, ], *... - egrep использует немножко поудобнее синтаксис extended regular expressions чем grep - не нужно столько \ ставить. 4. Подсовывайте опцию -e перед аргументом grep и sed. Для единичного аргумента не очень полезно, но очень будет полезно, когда вздумается подавать второй и третий аргумент: fgrep -e exp1 -e exp2 ... Так что: if echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO; then ... fi Всего лучшего, Петр -- Peter Pentchev r...@ringlet.net r...@freebsd.org p.penc...@storpool.com PGP key:http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint 2EE7 A7A5 17FC 124C F115 C354 651E EFB0 2527 DF13 Thit sentence is not self-referential because thit is not a word. signature.asc Description: Digital signature
Re: помогите с bash и условием
14:35 Thu 22 Aug, Владимир Скубриев wrote: TO=/dev/sdb SERIAL=RTF57NGH TO_DISK_INFO=`udevadm info --query=all -n $TO` echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO # проверяем результат последней команды if [ $? -ne 0 ]; then echo Parametr SERIALTO do not correspond hard drive TO - Exiting, beacuse we cannot delete ALL DATA ... echo ... !!! BE Careful !!! ... exit 3 fi Проверить наличие нужного диска можно проще: BACKUP_DISK=/dev/disk/by-id/usb-Easy_Disk_AA040127_007375-0:0 if [ ! -b $BACKUP_DISK ]; then echo Correct backup disk not found: $BACKUP_DISK 2 exit 1 fi -- WBR, Andrey Tataranovich -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20130822124325.gc12...@tataranovich-pc.local.aitoc.com
Re: помогите с bash и условием
On 22.08.2013 16:43, Andrey Tataranovich wrote: 14:35 Thu 22 Aug, Владимир Скубриев wrote: TO=/dev/sdb SERIAL=RTF57NGH TO_DISK_INFO=`udevadm info --query=all -n $TO` echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO # проверяем результат последней команды if [ $? -ne 0 ]; then echo Parametr SERIALTO do not correspond hard drive TO - Exiting, beacuse we cannot delete ALL DATA ... echo ... !!! BE Careful !!! ... exit 3 fi Проверить наличие нужного диска можно проще: BACKUP_DISK=/dev/disk/by-id/usb-Easy_Disk_AA040127_007375-0:0 if [ ! -b $BACKUP_DISK ]; then echo Correct backup disk not found: $BACKUP_DISK 2 exit 1 fi Я стремился к универсальности, вот: #!/bin/bash FROM=$1 TO=$2 SERIALTO=$3 TO_DISK_INFO=`udevadm info --query=all -n $TO` if [ ! $# == 3 ]; then echo Usage: FROM TO SERIALNUMBER_OF_DISK_TO exit 1 fi if [[ ! -b $2 ]] || [[ ! -b $1 ]]; then echo First | Second parametr is not a valid Block device exit 2 fi echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO if [ $? -ne 0 ]; then echo Parametr SERIALTO do not correspond hard drive TO - Exiting, beacuse we cannot delete ALL DATA ... exit 3 fi echo $TO_DISK_INFO | grep ID_BUS | grep -qi usb if [ $? -ne 0 ]; then echo This disk is not USB Backup Disk - Exiting, beacuse we cannot delete ALL DATA ... exit 4 fi -- С Уважением, специалист по техническому и программному обеспечению, системный администратор Скубриев Владимир ~~~ Россия, Ростовская область, г. Таганрог тел. моб: +7 (918) 504 38 20 skype: v.skubriev icq: 214-800-502 www: skubriev.ru -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/521609d8.2020...@skubriev.ru
Re: помогите с bash и условием
Peter Pentchev ☫ → To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 14:12 +0300 [ ... ] Так что: if echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO; then ... fi Это всё, конечно, хорошо, но человек хотел, чтобы блок внутри if ... fi выполнился, если grep выполнится _неуспешно_. Простого способа, как это сделать, я сходу не нашел, если только не городить что-то типа: if echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO || true; then ... fi что, согласитесь, не очень читабельно. -- Bright regards, Sergey Korobitsin, Chief Research Officer Arta Software, http://arta.kz/ xmpp:underta...@jabber.arta.kz -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20130822134346.ga2...@undertaker.dev.lan.arta.kz
Re: помогите с bash и условием
On 22.08.2013 17:43, Sergey Korobitsin wrote: Peter Pentchev ☫ → To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 14:12 +0300 [ ... ] Так что: if echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO; then ... fi этот способ не подходит - верно. Это всё, конечно, хорошо, но человек хотел, чтобы блок внутри if ... fi выполнился, если grep выполнится _неуспешно_. Простого способа, как это сделать, я сходу не нашел, если только не городить что-то типа: if echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO || true; then ... fi что, согласитесь, не очень читабельно. а что значит || true ? -- С Уважением, специалист по техническому и программному обеспечению, системный администратор Скубриев Владимир ~~~ Россия, Ростовская область, г. Таганрог тел. моб: +7 (918) 504 38 20 skype: v.skubriev icq: 214-800-502 www: skubriev.ru
Re: помогите с bash и условием
Владимир Скубриев ☫ → To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 17:47 +0400 On 22.08.2013 17:43, Sergey Korobitsin wrote: if echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO || true; then ... fi что, согласитесь, не очень читабельно. а что значит || true ? Оно ещё и не работает как надо :-( из man bash: --- ИЛИ-список имеет вид команда || команда2 Команда2 выполняется только и если только команда вернула ненулевой --- -- Bright regards, Sergey Korobitsin, Chief Research Officer Arta Software, http://arta.kz/ xmpp:underta...@jabber.arta.kz -- Если мысли сходятся - значит, они ограничены -- Саша Наташа, периодически -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20130822140207.gc2...@undertaker.dev.lan.arta.kz
Re: помогите с bash и условием
On Thu, Aug 22, 2013 at 07:43:46PM +0600, Sergey Korobitsin wrote: Peter Pentchev ☫ → To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 14:12 +0300 [ ... ] Так что: if echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO; then ... fi Это всё, конечно, хорошо, но человек хотел, чтобы блок внутри if ... fi выполнился, если grep выполнится _неуспешно_. Простого способа, как это сделать, я сходу не нашел, если только не городить что-то типа: if echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO || true; then ... fi что, согласитесь, не очень читабельно. Да... ошибка моя. Я-то забыл, что он хочет отрицание. Ну, if умеет отрицание: if ! echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO; then ... fi В точности то, для чего создана the reserved word !. Из dash(1): If the reserved word ! does not precede the pipeline, the exit status is the exit status of the last com‐ mand specified in the pipeline. Otherwise, the exit status is the logical NOT of the exit status of the last command. That is, if the last command returns zero, the exit status is 1; if the last command returns greater than zero, the exit status is zero. Или из bash(1): The return status of a pipeline is the exit status of the last command, unless the pipefail option is enabled. If pipefail is enabled, the pipeline's return status is the value of the last (rightmost) command to exit with a non-zero status, or zero if all commands exit successfully. If the reserved word ! precedes a pipeline, the exit status of that pipeline is the logical negation of the exit sta‐ tus as described above. The shell waits for all commands in the pipeline to terminate before returning a value. Так что if ! echo ... ; then ... сделает нужное. Всего лучшего, Петр -- Peter Pentchev r...@ringlet.net r...@freebsd.org p.penc...@storpool.com PGP key:http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint 2EE7 A7A5 17FC 124C F115 C354 651E EFB0 2527 DF13 This sentence no verb. signature.asc Description: Digital signature
Re: помогите с bash и условием
Peter Pentchev ☫ → To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 17:10 +0300 On Thu, Aug 22, 2013 at 07:43:46PM +0600, Sergey Korobitsin wrote: Ну, if умеет отрицание: if ! echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO; then ... fi В точности то, для чего создана the reserved word !. Из dash(1): If the reserved word ! does not precede the pipeline, the exit status is the exit status of the last com‐ mand specified in the pipeline. Otherwise, the exit status is the logical NOT of the exit status of the last command. That is, if the last command returns zero, the exit status is 1; if the last command returns greater than zero, the exit status is zero. Или из bash(1): The return status of a pipeline is the exit status of the last command, unless the pipefail option is enabled. If pipefail is enabled, the pipeline's return status is the value of the last (rightmost) command to exit with a non-zero status, or zero if all commands exit successfully. If the reserved word ! precedes a pipeline, the exit status of that pipeline is the logical negation of the exit sta‐ tus as described above. The shell waits for all commands in the pipeline to terminate before returning a value. Так что if ! echo ... ; then ... сделает нужное. Да, надо читать маны :-(. Я почему-то решил, что оно будет относиться к первой команде в пайпе. А вообще, лучше perl взять, там unless есть :-). -- Bright regards, Sergey Korobitsin, Chief Research Officer Arta Software, http://arta.kz/ xmpp:underta...@jabber.arta.kz -- Если мысли сходятся - значит, они ограничены -- Саша Наташа, периодически -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20130822143131.gd2...@undertaker.dev.lan.arta.kz
Re: помогите с bash и условием
Владимир Скубриев vladi...@skubriev.ru wrote: On 22.08.2013 14:28, Sergey Korobitsin wrote: Владимир Скубриев ??? ??? To Debian-russian@lists.debian.org @ Thu, Aug 22, 2013 14:23 +0400 [skipp] TO=/dev/sdb SERIAL=RTF57NGH TO_DISK_INFO=`udevadm info --query=all -n $TO` echo $TO_DISK_INFO | grep SERIAL_SHORT | grep -q $SERIALTO # проверяем результат последней команды if [ $? -ne 0 ]; then echo Parametr SERIALTO do not correspond hard drive TO - Exiting, beacuse we cannot delete ALL DATA ... echo ... !!! BE Careful !!! ... exit 3 fi Любите вы всё усложнять на пустом месте. пайпов вагон, зачем? #/bin/sh TO=/dev/sdb SERIAL=RTF57NGH if [ $(udevadm info --query=all -n ${TO} | grep -c SERIAL_SHORT=${SERIAL}) != 1 ]; then echo blah-blah fi ы? -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/g3khea-ng@woofie.cef.spbstu.ru
Re: помогите с bash и условием
Sergey Korobitsin - debian-russian@lists.debian.org @ Thu, 22 Aug 2013 20:31:31 +0600: Ну, if умеет отрицание: if ! echo $TO_DISK_INFO | fgrep -e $SERIAL_SHORT | fgrep -qe $SERIALTO; then ... fi [...] Так что if ! echo ... ; then ... сделает нужное. SK Да, надо читать маны :-(. Я почему-то решил, что оно будет относиться к SK первой команде в пайпе. А вообще, лучше perl взять, там unless есть :-). Еще можно написать if command then : else содержательный текст fi sh-совместимо, кстати. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87wqndsb5w@wizzle.ran.pp.ru