Здрасти. Вот вам еще одна задачка из моего загашника, которую я скидываю на собесах, размять так сказать мозги кандидату.
Задачка придумана инженерами NASA, специально для будущих разработчиков. Которым в будущем предстоит писать прошивки для их невзъебенных спейс шаттлов и AI гавноходов.
Хм, а ты думал они ни СИська пишут? Нет конечно, там чистый Bash!
Ладно, это пена, задача основана на реальных кейсах.
Сейчас будет что-то из оперы Javascript, но касаемо Bash. Устраиваемся поудобнее, наливаем чаёк/кофеёк. Поехали!
true
echo $?
false
echo $?
echo $((true == false))
Первый блок возвращает 0, второй соответственно 1. А что вернет третий? Очевидно 0? А вот и хуй там плавал! Вернет 1.
Знаешь почему? Потому что ты мыслишь шаблонами, да
true = 0, false = 1, но ты упустил саму суть.Операция == внутри
$(()) не является равенством возвращаемых СТАТУСОВ в 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
Теперь всё встало на свои места. Мы объявили переменные и задали им значения. А потом уже сравниваем СТАТУСЫ и не РАВЕНСТВО двух чисел.
Такие дела. Вроде безобидная штука, а на логику пиздец как влияет.
Поэтому всегда будь внимателен. И заранее проверяй такие штуки перед деплоем в продакшен. Хотя совет дурацкий, согласен. Проще раздеплоиться и потом уже на проде пофиксить. Бест практики ёпта!
Ладно, не болей, увидимся!
tags: #bash
@ВАSНDАYS | BАSHDАYS.CОM