bash, EOFF [END_SCRIPT]

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
frost666dark
Сообщения: 346
ОС: archlinux

bash, EOFF [END_SCRIPT]

Сообщение frost666dark »

Есть функция:

Код: Выделить всё

#!/bin/bash

DB="/var/lib/ulogd/ulog.db"
TABLE="ulog"

sqlite3 $DB <<EOFF || $COMMAND
SELECT * FROM $TABLE;
.quit
EOFF


Для наглядности я добавил COMMAND которая должна зависеть от внутреннего параметра в самом скрипте (не от stdin!), в этом и вопрос: Как можно делать ее подмену?
Пробовал через case:

Код: Выделить всё

case "$1" in
        grep)
                COMMAND=`grep 1193152852`
       ;;
        *)
                echo "Usage: $0 {grep}"
                exit 1
       ;;
esac


Прошу не обращать внимание на "grep 1193152852", там может быть все что угодно, включая ввод из stdin.
Вобщем case то выполняется но EOFF нет.

Вобщем не важно через case или еще как то, но нужно подставлять COMMAND, может есть какие то более здоровые идеи?

Может от меня нужны еще какие то пояснения...
Памажите :)

P.S. и еще чем отличается EOFF от END_SCRIPT ?
PS: Слакварщики приглашаются slackware@conference.jabber.ru
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: bash, EOFF [END_SCRIPT]

Сообщение Red User »

frost666dark писал(а):
24.10.2007 13:33
Вобщем case то выполняется но EOFF нет.

А на основании чего сделан вывод о том, что EOFF не выполняется?

frost666dark писал(а):
24.10.2007 13:33
Прошу не обращать внимание на "grep 1193152852", там может быть все что угодно, включая ввод из stdin.

А grep здесь действительно очень странно выглядит. Если sqlite3 возвращает не 0, то выполняется команда, полученная в результате грепанья стандартного ввода. Больше бы подошло что-то вроде COMMAND="echo Error".

frost666dark писал(а):
24.10.2007 13:33
P.S. и еще чем отличается EOFF от END_SCRIPT ?

Код: Выделить всё

sqlite3 $DB <<EOFF
blabla
EOFF
и

Код: Выделить всё

sqlite3 $DB <<END_SCRIPT
blabla
END_SCRIPT
ничем. Вместо EOFF можно что угодно написать.
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
Аватара пользователя
frost666dark
Сообщения: 346
ОС: archlinux

Re: bash, EOFF [END_SCRIPT]

Сообщение frost666dark »

Red User писал(а):
24.10.2007 15:56
frost666dark писал(а):
24.10.2007 13:33
Вобщем case то выполняется но EOFF нет.

А на основании чего сделан вывод о том, что EOFF не выполняется?


Вывод сделан на основании того что grep ничего не грепает, он остается в ожидании...

Red User писал(а):
24.10.2007 15:56
frost666dark писал(а):
24.10.2007 13:33
Прошу не обращать внимание на "grep 1193152852", там может быть все что угодно, включая ввод из stdin.

А grep здесь действительно очень странно выглядит. Если sqlite3 возвращает не 0, то выполняется команда, полученная в результате грепанья стандартного ввода. Больше бы подошло что-то вроде COMMAND="echo Error".


Честно говоря, мне нужно именно обрабатывать вывод "SELECT * FROM ulog;" непосредственно bash средствами (желательно было бы). Там вместо грепа и awk и sed может быть и все что угодно.

Red User писал(а):
24.10.2007 15:56
frost666dark писал(а):
24.10.2007 13:33
P.S. и еще чем отличается EOFF от END_SCRIPT ?

Код: Выделить всё

sqlite3 $DB <<EOFF
blabla
EOFF
и

Код: Выделить всё

sqlite3 $DB <<END_SCRIPT
blabla
END_SCRIPT
ничем. Вместо EOFF можно что угодно написать.


Понятно.
PS: Слакварщики приглашаются slackware@conference.jabber.ru
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: bash, EOFF [END_SCRIPT]

Сообщение Red User »

(frost666dark) писал(а):Вывод сделан на основании того что grep ничего не грепает, он остается в ожидании...

А говоришь на grep не обращать внимания. Это происходит в строке COMMAND=`grep 1193152852`, в которой grep парсит stdin (то, что юзер набирает в консоли), а затем пропарсенные строчки объединяются в одну и присваиваются COMMAND. ` и ' - далеко не одно и то же.

Red User писал(а):
24.10.2007 15:56
А grep здесь действительно очень странно выглядит. Если sqlite3 возвращает не 0, то выполняется команда, полученная в результате грепанья стандартного ввода. Больше бы подошло что-то вроде COMMAND="echo Error".

| и || - две большие разницы :cool:
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
Аватара пользователя
frost666dark
Сообщения: 346
ОС: archlinux

Re: bash, EOFF [END_SCRIPT]

Сообщение frost666dark »

Все... Вопрос решен, вот заготовка рабочего скрипта :)

Код: Выделить всё

#!/bin/bash

DB="/var/lib/ulogd/ulog.db"
TABLE="ulog"
NULL="grep -vE Z"

case "$1" in
        list)
        COMMAND=$NULL
       ;;
        stat)
        COMMAND="grep $2"
       ;;
        *)
        echo "usage $0 list"
esac

sqlite3 $DB <<EOFF | $COMMAND
SELECT * FROM $TABLE;
.quit
EOFF
PS: Слакварщики приглашаются slackware@conference.jabber.ru
Спасибо сказали:
Ответить