помогите разобраться с shell-скриптом (небольшой непонятный код)

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

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

NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: помогите разобраться с shell-скриптом

Сообщение NickLion »

butch писал(а):
03.07.2009 15:16
И и ИЛИ - коммутативные операции
вы можете переставлять их местами - от этого итог не меняется.

Меняется, если используются ленивые вычисления.
Спасибо сказали:
Аватара пользователя
altwazar
Сообщения: 427
Статус: Zz
ОС: Calculate

Re: помогите разобраться с shell-скриптом

Сообщение altwazar »

butch писал(а):
03.07.2009 15:16
И и ИЛИ - коммутативные операции
вы можете переставлять их местами - от этого итог не меняется.


Да я просто не понял, какие претензии были в вашем том посте. Вроде drBatty все верно описал, может я чего пропустил?

butch писал(а):
03.07.2009 14:25
можете как угодно переставлять условие if - от этого ничего не изменится и проверятся будут все уловия по правилам булевой алгебры.

А тут я не понял, почему все условия будут проверяться при ||(&&)? (по условиям той же булевой алгебры).

NickLion писал(а):
03.07.2009 17:34
Меняется, если используются ленивые вычисления.


В баше при команда1 ||(&&) команда2 вроде же тоже самое практически получается? Команда2 тут может и не выполняться.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: помогите разобраться с shell-скриптом

Сообщение diesel »

altwazar писал(а):
03.07.2009 19:29
NickLion писал(а):
03.07.2009 17:34
Меняется, если используются ленивые вычисления.


В баше при команда1 ||(&&) команда2 вроде же тоже самое практически получается? Команда2 тут может и не выполняться.

да

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

[vasiliy@eloiza xmonad]$ ls /opt/tmp 2>/dev/null || echo "no"
no
[vasiliy@eloiza xmonad]$ ls >/dev/null || echo "no"
[vasiliy@eloiza xmonad]$


поэтому по правилам булевой алгебры вы можете переставлять операнды, а по факту - не всегда стоит этим заниматься
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: помогите разобраться с shell-скриптом

Сообщение drBatty »

butch писал(а):
03.07.2009 14:25
теперь верный ответ для if\then
Код
if true || false || false
then
echo "ты не прав"
fi

можете как угодно переставлять условие if - от этого ничего не изменится и проверятся будут все уловия по правилам булевой алгебры.
здесь условия объедены || - логическим ИЛИ. но как же, спросит drBatty, это получается?!?
ведь:

выполняются команды(true и false), причём так-как вы объединили их ||, то выполняются все false до первого true
вы мне не верите?
ну читайте доки дальше, вы их не дочитали :(
butch писал(а):
03.07.2009 15:16
И и ИЛИ - коммутативные операции
вы можете переставлять их местами - от этого итог не меняется.

щаз!

$

$ echo "test string1" || echo "test str2" test string1 $ echo "test str2" || echo "test string1" test str2

от перемены мест всё ОЧЕНЬ меняется.
команда echo возвращает true, потому вторая команда НЕ выполняется (для истинности выражения X || Y достаточно истинности любого операнда, потому оболочка и не выполняет второй операнд) Вы используете true/false, которые ничего не выводят, потому вы НЕ ЗНАЕТЕ, как это работает. Но вы можете узнать (если ещё немного почитаете) :

$

doc ~ $ cat ttst #!/bin/bash -x if false || true || false || false then echo "ты не прав" fi doc ~ $ ./ttst + false + true + echo 'ты не прав' ты не прав

как видите, выполняется не все true/false, а только false до первой true.


PS: абсолютно те-же правила действуют в C/C++, за исключением того, что в си true это НЕ ноль. а так - тоже самое. Это не касается других операций, например

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

expr1 * expr2

в си вычисляются оба подвыражения, даже если expr1 равно нулю, и не важно, чему равно expr2.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: помогите разобраться с shell-скриптом

Сообщение drBatty »

diesel писал(а):
04.07.2009 00:14
поэтому по правилам булевой алгебры вы можете переставлять операнды, а по факту - не всегда стоит этим заниматься

а кто сказал, что правила булевой алгебры действуют в bash'е? они действуют конечно... но не так прямолинейно. да и в правилах булевой алгебры не записан порядок и ход вычислений. просто false || false => false. а уж что вычисляется в первую очередь, а что во вторую, а что вообще не вычисляется - остаётся за кадром.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: помогите разобраться с shell-скриптом

Сообщение diesel »

drBatty писал(а):
04.07.2009 18:27
diesel писал(а):
04.07.2009 00:14
поэтому по правилам булевой алгебры вы можете переставлять операнды, а по факту - не всегда стоит этим заниматься

а кто сказал, что правила булевой алгебры действуют в bash'е? они действуют конечно... но не так прямолинейно. да и в правилах булевой алгебры не записан порядок и ход вычислений. просто false || false => false. а уж что вычисляется в первую очередь, а что во вторую, а что вообще не вычисляется - остаётся за кадром.

в правилах булевой алгебры, как написано выше, операции && и || коммутативны, то есть не зависят от порядка следования операндов. то есть в вычислении нужно было бы предполагать что все вычисляется одновременно. о том что на практике это не всегда так, в том числе и в шеле - ну да, это не так, я об этом и говорил.
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: помогите разобраться с shell-скриптом

Сообщение deadhead »

//offtop
может имеет смысл продолжить дискуссию в отдельной ветке ;-)
[x] close
Спасибо сказали:
Аватара пользователя
altwazar
Сообщения: 427
Статус: Zz
ОС: Calculate

Re: помогите разобраться с shell-скриптом

Сообщение altwazar »

diesel писал(а):
04.07.2009 19:15
в правилах булевой алгебры, как написано выше, операции && и || коммутативны, то есть не зависят от порядка следования операндов. то есть в вычислении нужно было бы предполагать что все вычисляется одновременно. о том что на практике это не всегда так, в том числе и в шеле - ну да, это не так, я об этом и говорил.


Ну тут этот закон соблюдается. Сам результат && (||) от этого же не меняется.
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: помогите разобраться с shell-скриптом

Сообщение butch »

drBatty писал(а):
04.07.2009 18:12
щаз!
$


$ echo "test string1" || echo "test str2"

<censored>. я всего лишь хотел сказать, что логические операции в проверке условий и связка команд в последовательности - разные вещи. ведь так?
drBatty писал(а):
04.07.2009 18:12
if false || true || false || false
then
echo "ты не прав"
fi
doc ~ $ ./ttst
+ false
+ true
+ echo 'ты не прав'
ты не прав

это логично для оптимизации проверки условий и частный случай для ИЛИ. будь условия смешанные - пришлось бы проверить их все. правильно?
никто не отменял возможно оптимайзить проверку условий, ведь если при ИЛИ попадается первый тру - однозначно все будет true.
здесь оптимизация проверки условий присутствует, а не логика связки выполнения команд (шеловая)
Спасибо сказали:
Аватара пользователя
altwazar
Сообщения: 427
Статус: Zz
ОС: Calculate

Re: помогите разобраться с shell-скриптом

Сообщение altwazar »

butch писал(а):
06.07.2009 11:05
<censored>. я всего лишь хотел сказать, что логические операции в проверке условий и связка команд в последовательности - разные вещи. ведь так?

butch писал(а):
06.07.2009 11:05
здесь оптимизация проверки условий присутствует, а не логика связки выполнения команд (шеловая)


Я и не понял, к чему вы это сказали. По сути то одно и тоже получается.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: помогите разобраться с shell-скриптом

Сообщение drBatty »

diesel писал(а):
04.07.2009 19:15
в правилах булевой алгебры, как написано выше, операции && и || коммутативны, то есть не зависят от порядка следования операндов. то есть в вычислении нужно было бы предполагать что все вычисляется одновременно. о том что на практике это не всегда так, в том числе и в шеле - ну да, это не так, я об этом и говорил.

не. не только на практике, но и в теории:

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

1 || X == 1

при любом X.
и нет такого правила в булевой алгебре, которое заставит вас вычислять X.
наоборот - по правилам, выражение 1 || X эквивалентно выражению 1.
butch писал(а):
06.07.2009 11:05
<censored>. я всего лишь хотел сказать, что логические операции в проверке условий и связка команд в последовательности - разные вещи. ведь так?

нет.
операция || сама по себе - то-же самое, что и операция || внутри if/then/fi
butch писал(а):
06.07.2009 11:05
и частный случай для ИЛИ. будь условия смешанные - пришлось бы проверить их все. правильно?

нет. это общий случай.
будь операции как угодно смешанные, они ВСЁ РАВНО не всегда выполняются все.
и/или список выполняется полностью тогда, и только тогда, когда результат не известен до последнего оператора.
например:

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

X X X X X X X X X X X && Y

последняя операция && вычислит Y тогда, и только тогда, когда предыдущие XXX дадут 1, если они равны нулю - то Y не выполнится. так-же для ||, только 1<->0.
для шелла это именно список операций, шел идёт по ним слева направо, до тех пор, пока не получит однозначный ответ(или пока список не кончится).
например

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

X && X && X && X && X

будет выполнятся до тех пор, пока какой-то X не вернёт код false.
butch писал(а):
06.07.2009 11:05
никто не отменял возможно оптимайзить проверку условий, ведь если при ИЛИ попадается первый тру - однозначно все будет true.
здесь оптимизация проверки условий присутствует, а не логика связки выполнения команд (шеловая)
нет тут оптимизации. это логика такая...
привыкайте.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: помогите разобраться с shell-скриптом

Сообщение Portnov »

Вобще говоря, это зависит от реализации языка. C и shell обладают описанной логикой, когда то что не надо - не вычисляется. Но можно представить язык, в котором в выражении f() && g() сначала вычисляются f и g, а потом уже вычисляется &&. Результат операции && в любом случае не зависит от порядка операндов, но вот вычисление этих операндов может сопровождаться побочными эффектами (как то: изменение глобальных переменных, вывод на экран фразы Hello world и др), но побочные эффекты не имеют никакого отношения к булевой логике.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: помогите разобраться с shell-скриптом

Сообщение drBatty »

Portnov писал(а):
07.07.2009 14:55
но побочные эффекты не имеют никакого отношения к булевой логике.

я с вами полностью согласен.
к тому-же, в bash тоже есть не ленивое

$

$ [ `echo AAA >>t.txt` -o `echo BBB >>t.txt` ]; echo $?; cat t.txt 0 AAA BBB

Как видите, выполняются ВСЕ аргументы.
Ну и в языке Си тоже есть &,| если аргументы ограниченны 0 или 1, то эти операции корректно работают, и подчиняются правилам булевой алгебры, но при этом выполняются все аргументы. Для гарантии правильности в C можно использовать конструкцию "приведения" к булевой форме !!x
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: