March 4th, 2015

nyaload

logical A ? B : C

Насколько я понимаю, в shell нельзя выразить if A ; then B ; else C ; fi через операции &&, ||, ! так, чтобы сохранить побочные эффекты. Простое доказательство не вижу, но если перебирать разные варианты "что слева и справа от корневой операции", то видно что какую-то команду придётся выполнить дважды.
Пара неработающих примеров:
(A && B) || C — когда A=true B=false C=true то return code выражения целиком это true, хотя хочется false.
(A && B) || (! A && C) — A может вызываться дважды

update: если добавить команду exit, то возможно:
( A && { B || exit 1 ; } || C )
Круглые скобки порождают подпроцесс, exit выходит из него. Фигурные скобки - только для для группировки выражения, как обычные скобки в математике. && приоритетней ||, так же как умножение приоритетней сложения. Ну и стандартная unix-путаница "1 это false, 0 это true".