LINUX.ORG.RU

Пара вопросов знатокам shell


0

1

Всем привет! Возникла пара вопросов по чистому /bin/sh (не bash):

Вопрос первый: Есть конструкция подобного рода:

 false || (echo "Oh,no! O_o" ; exit 1) 
т.е.: если условие не выполнено, вывести сообщение и выйти с кодом возврата 1. Такая конструкция не срабатывает (в /bin/sh), ибо, насколько я понимаю, происходит выход из группировки ( ), а скрипт отрабатывает дальше. Так вот, мне надо выйти из самого скрипта. Подскажите, пожалуйста, как правильнее это реализовать без использования if then?

Вопрос второй: Есть конфиг который надо распарсить. Он имеет вид:

email1@etc.com{
ip-address
domain-name.com
blahblahblah
}

email2@google.com{
domain.ru
8.8.8.8
}

email3@yandex.com{
ip1
10.10.10.10
domain
domain2
}

То есть: идёт почтовый адрес, который можно идентифицировать по наличию фигурной открывающей скобки {, далее идёт список ip-адресов и доменных имён. В итоге мне надо сгрепить от определённого почтового адреса и до закрывающей фигурной скобки }. Ничего не приходит на ум :(

Заранее благодарю за ответ.

1)

false || {echo «Oh,no! O_o» ; exit 1}

2) как-то так:

grep_config(){
email=$1;shift
config=$1; shift
email=$(echo $email| sed 's/\./\\./')
awk 'BEGIN {hit=0} /^\}/{hit=0} /^'«${email}»'\{/{hit=1} {if(hit == 1){print $0;}}'
}
email_addresses=$(grep_config «some@email.net» «/path/to/config»)

Slavaz ★★★★★
()
rain@acnote:/tmp$ mf() { sed -n '/'$1'/,/^}$/p' file ; }
rain@acnote:/tmp$ mf email2@google.com
email2@google.com{
domain.ru
8.8.8.8
}
rain@acnote:/tmp$ mf email1@etc.com
email1@etc.com{
ip-address
domain-name.com
blahblahblah
}
YAR ★★★★★
()
Ответ на: комментарий от lazyklimm
rain@acnote:/tmp$ ls -l `which sh`
lrwxrwxrwx 1 root root 4 Мар 31 21:34 /bin/sh -> dash
rain@acnote:/tmp$ ls -l /bin/dash 
-rwxr-xr-x 1 root root 84144 Дек 15  2010 /bin/dash
rain@acnote:/tmp$ ls -l /bin/bash 
-rwxr-xr-x 1 root root 811156 Апр 10  2010 /bin/bash
rain@acnote:/tmp$ sh file.sh
Oh,no! O_o
rain@acnote:/tmp$ cat file.sh 
#!/bin/sh

false || { echo "Oh,no! O_o" ; exit 1; }
echo 123

Или как еще проверить? )

YAR ★★★★★
()
Ответ на: комментарий от XnL

>А зачем они нужны, если можно вместо ; поставить && ?

Начинаются чудеса:

$ false || echo O_o && echo $?
O_o
0
$ true || echo O_o && echo $?
0
$

Я об этом ещё в ABS Guide читал.

Othniel
() автор топика
Ответ на: комментарий от XnL

Потому что команда после && будет уже вне проверки «command && true || false». Иначе говоря, она выполнится всегда, вне зависимости от результата выполнения первой команды:

rain@acnote:~$ true && echo 1 || echo 0 && echo something
1
something
rain@acnote:~$ false && echo 1 || echo 0 && echo something
0
something

YAR ★★★★★
()
Ответ на: комментарий от YAR

srv0:~> cat testtt
#!/bin/sh

false || { echo blahblahblah ; exit 1 }
echo O_o

srv0:~> ./testtt
./testtt: 8: Syntax error: end of file unexpected (expecting «}»)
srv0:~>

Не взлетает.

Othniel
() автор топика
Ответ на: комментарий от sergej

>Круглая скобка - это не группировка, а запуск нового шелла

Да я в курсе, я просто альтернативы не вижу. Должна же быть Ъ-группировка в Ъ-шеле?

Othniel
() автор топика
Ответ на: комментарий от Othniel

1) да, «не взлетит». Невнимательно прочитал условия, сорри

2) делаю поправки (писал «навскидку»):

awk ' BEGIN{hit=0} /^'"${email}"'\{/{hit=1; next} /^\}/{hit=0} {if(hit == 1){print $0;}}' "${config}"
заодно коменты для обучения:

awk '
BEGIN                  /* Блок, запускаемый перед стартом остальных частей скрипта */
  {
    hit=0;             /* нет попаданий в секцию конфига */
  }

/^'"${email}"'\{/      /* найден нужный email.*/
  {hit=1; next}        /* помечаем как попадание в нужную секцию и переходим к обработке следующей строки */

/^\}/                  /* если есть фигурная скобка в строке, то */
  {
    hit=0              /* считаем это окончанием секции. */
  }

  {                    /* этот блок будет срабатывать на каждую строку */
    if(hit == 1){      /* если оказались внутри секции */
      print $0;        /* печатаем текущую строку */
    }
  }'

"${config}"
Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

Спасибо за разъяснения, я всегда ненавидел регулярки, sed и awk :D

Othniel
() автор топика
Ответ на: комментарий от YAR

>Сравни с моим примером

Похоже взлетело О_о Спасибо большое!

Othniel
() автор топика

Камрады, ещё один маленький вопросик, плиз: как проверить, пуста ли директория или нет? Извращённые идеи есть. но хотелось бы элегантного решения.

Othniel
() автор топика
Ответ на: комментарий от Slavaz

>ls | wc -l

Похоже придётся, раз нет ничего типа test'а.

Othniel
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.