В fish true == 0, но false != 1?

В рыбе true кажется равным 0:

❯ if true == 0; echo "YES"; else; echo "NO"; end
YES

Но false похоже не равно 1:

❯ if false == 1; echo "YES"; else; echo "NO"; end
NO

В bash оба они не эквивалентны своему числовому значению:

$ if [ true == 0 ]; then echo "YES"; else echo "NO"; fi
NO
$ if [ false == 1 ]; then echo "YES"; else echo "NO"; fi
NO

Кажется странным, что рыба будет считать одно значение истинности равным своему числовому эквиваленту, но не другое.

Может, этому есть объяснение?

In bash both of them are not equivalent to their numeric value:?? В Bash строка true и строка false — это просто строка.
KamilCuk 10.01.2023 18:17

Вы передаете аргументы == и 0/1 командам true/false... это не оболочка читает их (я имею в виду, технически это так, потому что это встроенные функции, но я имею в виду, что не та часть, которая будет обрабатывать реальный синтаксис оболочки ). Таким образом, здесь у вас нет сравнения, кроме того, что делает if, то есть «проверьте, имеет ли результат следующей команды нулевой код выхода». Это потому, что в вашем примере с рыбой вы не использовали команду [, которую использовали в Bash.

CherryDT 10.01.2023 18:41

@KamilCuk Да, true и false - это строки, но они также являются именами (встроенных) команд. Команды можно использовать напрямую (не в [...]) как условия: ok=true ; if $ok ; then echo OK ; else echo 'Huh?' ; fi

Keith Thompson 10.01.2023 19:17
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел "Заголовок" в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
1
3
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Команда true игнорирует аргументы и завершается с нулевым статусом выхода, что означает успех.

if true you can put literally anything here; echo "YES"; else; echo "NO"; end

Команда false игнорирует аргументы и завершается с ненулевым статусом выхода, что означает сбой.

if false you can put literally anything here too; echo "YES"; else; echo "NO"; end

Эквивалентный код Bash:

if true anything here; then echo "YES"; else echo "NO"; fi
if false anything here too; then echo "YES"; else echo "NO"; fi

Команда [ true == 0 ] выполняет команду [ и сравнивает строку true со строкой 0. Поскольку true и 0 — разные строки, сравнение (логически) ложно, поэтому команда [ завершается с ненулевым статусом выхода. Аналогично с false == 0. Обратите внимание, что == является расширением [ — это [ true = 0 ] в стандартном [.

Вы можете сравнить, что в Fish команда [ также «обе они не эквивалентны их числовому значению»:

if [ true == 0 ]; echo "YES"; else; echo "NO"; end
if [ false == 1 ]; echo "YES"; else; echo "NO"; end

Когда-то (версия 2.7) встроенные функции fish true и false вызывали ошибку, если вы вводили им какие-либо аргументы. Теперь (версия 3.5) он их просто молча игнорирует. (И ни в одной из версий не задокументировано упоминание аргументов.) Я предполагаю, что это попытка быть более совместимым с POSIX?

chepner 10.01.2023 18:31

«Я предполагаю, что он пытается быть более совместимым с POSIX» — больше похоже на то, что он меняется, чтобы соответствовать ожиданиям пользователей.

glenn jackman 10.01.2023 22:37

Другие вопросы по теме