stmt<sub>1</sub> && stmt<sub>2</sub> || stmt<sub>3</sub> && stmt<sub>4</sub>
оценивается как
( ( stmt<sub>1</sub> && stmt<sub>2</sub> ) || stmt<sub>3</sub> ) && stmt<sub>4</sub>
т.е. слева направо.
Так что логика
Execute stmt<sub>1</sub>
If it succeeds,
then
execute stmt<sub>2</sub>
endif
If stmt<sub>1</sub> succeeds and stmt<sub>2</sub> succeeds,
then
<i>(do nothing here)</i>
else # i.e., if stmt<sub>1</sub> fails, OR stmt<sub>1</sub> succeeds and then stmt<sub>2</sub> fails
execute stmt<sub>3</sub>
endif
If stmt<sub>1</sub> succeeds and stmt<sub>2</sub> succeeds,
OR stmt<sub>3</sub> succeeds,
then
execute stmt<sub>4</sub>
endif
С stmt<sub>2</sub>
и stmt<sub>3</sub>
оба echo
утверждения, они оба всегда успешны,
и так stmt<sub>4</sub>
(оператор return
)
всегда выполняется.
Я подозреваю, что вы ожидали
( stmt<sub>1</sub> && stmt<sub>2</sub> ) || ( stmt<sub>3</sub> && stmt<sub>4</sub> )
и вы можете получить такое поведение (в целом), набрав скобки,
просто так:
( [[ 5 > <i>N</i> ]] && echo true ) || ( echo false && return ) <b># No, don’t do this</b>
или фигурные скобки:
{ [[ 5 > <i>N</i> ]] && echo true; } || { echo false && return; }
Обратите внимание, что вы должны иметь пробел после {
и точка с запятой перед }
.
Обратите внимание, что в скобках команды выполняются в подоболочках,
в то время как с фигурными скобками они не (они работают в контексте основной оболочки).
В вашем конкретном примере кода вы должны использовать фигурные скобки
(по крайней мере, для части после ||
),
, поскольку return
не имеет никакого эффекта, если он запускается в подоболочке.