Состояние выхода скрипта - это состояние выхода последней команды, которую он запускает.
Если ваша последняя команда:
[[ "$a" -eq "$b" ]] && echo "equal"
... тогда, если значения не численно равно, эта команда замыкает накоротко после первого компонента, который имеет ненулевой статус выхода.
В отличие от этого, когда ваша последняя команда:
echo "a is greater"
... тогда нет неудачной команды для установки ненулевого значения в $?
.
Один из способов сделать ваш код более эквивалентным исходной формулировке:
#!/usr/bin/env bash
read a
read b
[[ "$a" -gt "$b" ]] && { echo "a is greater"; exit; }
[[ "$a" -lt "$b" ]] && { echo "b is greater"; exit; }
[[ "$a" -eq "$b" ]] && { echo "equal"; exit; }
... или, что менее эквивалентно, но менее громко, просто добавив exit 0
в конец.