Про вербальный секс

Здрасти. Вот вам ещё одна задачка из моего загашника, которую я скидываю на собесах, размять, так сказать, мозги кандидату.

Хм, а ты думал, они на Сишке пишут? Нет, конечно, там чистый Bash!

Ладно, это пена, задача основана на реальных кейсах.

Сейчас будет что-то из оперы JavaScript, но касаемо Bash. Устраиваемся поудобнее, наливаем чаёк/кофеёк. Поехали!

true
echo $?

false
echo $?

echo $((true == false))

Первый блок возвращает 0, второй, соответственно, 1. А что вернёт третий? Очевидно, 0? А вот и хуй там плавал! Вернёт 1.

Знаешь почему? Потому что ты мыслишь шаблонами: да, true = 0, false = 1, но ты упустил саму суть.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Операция == внутри $(()) не является равенством возвращаемых СТАТУСОВ в Bash. Она выполняет проверку равенства двух чисел.

true и false обрабатываются как переменные, но этим переменным не присвоены никакие значения. Поэтому они интерпретируются как 0.

echo $((true))
echo $((false))

В обоих случаях ты получишь 0. Получается так:

echo $((0 == 0))

Оба числа равны, возвращается истина, то есть та самая единица.

А как сделать правильно?

Ну, например, так:

true
TRUE=$?
false
FALSE=$?
if (( $TRUE == $FALSE )); then echo TRUE; else echo FALSE; fi

Теперь всё встало на свои места. Мы объявили переменные и задали им значения. А потом уже сравниваем СТАТУСЫ, а не РАВЕНСТВО двух чисел.

Такие дела. Вроде безобидная штука, а на логику пиздец как влияет.

Ладно, не болей, увидимся!