Про вербальный секс
Здрасти. Вот вам ещё одна задачка из моего загашника, которую я скидываю на собесах, размять, так сказать, мозги кандидату.
Хм, а ты думал, они на Сишке пишут? Нет, конечно, там чистый 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
Теперь всё встало на свои места. Мы объявили переменные и задали им значения. А потом уже сравниваем СТАТУСЫ, а не РАВЕНСТВО двух чисел.
Такие дела. Вроде безобидная штука, а на логику пиздец как влияет.
Ладно, не болей, увидимся!








Комментарии