butch писал(а): ↑03.07.2009 15:16И и ИЛИ - коммутативные операции
вы можете переставлять их местами - от этого итог не меняется.
Меняется, если используются ленивые вычисления.
Модераторы: /dev/random, Модераторы разделов
butch писал(а): ↑03.07.2009 15:16И и ИЛИ - коммутативные операции
вы можете переставлять их местами - от этого итог не меняется.
butch писал(а): ↑03.07.2009 15:16И и ИЛИ - коммутативные операции
вы можете переставлять их местами - от этого итог не меняется.
Код: Выделить всё
[vasiliy@eloiza xmonad]$ ls /opt/tmp 2>/dev/null || echo "no"
no
[vasiliy@eloiza xmonad]$ ls >/dev/null || echo "no"
[vasiliy@eloiza xmonad]$
butch писал(а): ↑03.07.2009 14:25теперь верный ответ для if\then
Код
if true || false || false
then
echo "ты не прав"
fi
можете как угодно переставлять условие if - от этого ничего не изменится и проверятся будут все уловия по правилам булевой алгебры.
здесь условия объедены || - логическим ИЛИ. но как же, спросит drBatty, это получается?!?
ведь:
$
$ echo "test string1" || echo "test str2"
test string1
$ echo "test str2" || echo "test string1"
test str2
$
doc ~ $ cat ttst
#!/bin/bash -x
if false || true || false || false
then
echo "ты не прав"
fi
doc ~ $ ./ttst
+ false
+ true
+ echo 'ты не прав'
ты не прав
Код: Выделить всё
expr1 * expr2
drBatty писал(а): ↑04.07.2009 18:27
а кто сказал, что правила булевой алгебры действуют в bash'е? они действуют конечно... но не так прямолинейно. да и в правилах булевой алгебры не записан порядок и ход вычислений. просто false || false => false. а уж что вычисляется в первую очередь, а что во вторую, а что вообще не вычисляется - остаётся за кадром.
diesel писал(а): ↑04.07.2009 19:15в правилах булевой алгебры, как написано выше, операции && и || коммутативны, то есть не зависят от порядка следования операндов. то есть в вычислении нужно было бы предполагать что все вычисляется одновременно. о том что на практике это не всегда так, в том числе и в шеле - ну да, это не так, я об этом и говорил.
diesel писал(а): ↑04.07.2009 19:15в правилах булевой алгебры, как написано выше, операции && и || коммутативны, то есть не зависят от порядка следования операндов. то есть в вычислении нужно было бы предполагать что все вычисляется одновременно. о том что на практике это не всегда так, в том числе и в шеле - ну да, это не так, я об этом и говорил.
Код: Выделить всё
1 || X == 1
Код: Выделить всё
X X X X X X X X X X X && Y
Код: Выделить всё
X && X && X && X && X
нет тут оптимизации. это логика такая...
$
$ [ `echo AAA >>t.txt` -o `echo BBB >>t.txt` ]; echo $?; cat t.txt
0
AAA
BBB