Почему HackerRank говорит, что код, использующий короткое замыкание логического лога c, имеет «ошибку времени выполнения»? - PullRequest
0 голосов
/ 01 апреля 2020

Я делаю свои первые шаги в bash, изучая некоторые простые проблемы. Я работал над некоторыми операторами if..else, такими как:

#! /usr/bin/env bash

read a
read b
if [[ "$a" -gt "$b" ]]; then
    echo "a is greater"
elif [[ "$a" -lt "$b" ]]; then
    echo "b is greater"
else
    echo "equal"
fi

Ранее я видел использование двойных амперсандов для написания таких операторов, но когда я попробовал следующее, он возвратил «Ошибка времени выполнения».

#! /usr/bin/env bash

read a 
read b
[[ "$a" -gt "$b" ]] && echo "a is greater"
[[ "$a" -lt "$b" ]] && echo "b is greater"
[[ "$a" -eq "$b" ]] && echo "equal"

Может ли кто-нибудь уточнить, почему второй путь неправильный, а также дать некоторое представление о том, какой путь предпочтительнее?

Спасибо

1 Ответ

1 голос
/ 01 апреля 2020

Состояние выхода скрипта - это состояние выхода последней команды, которую он запускает.

Если ваша последняя команда:

[[ "$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 в конец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...