Попытка логического сравнения в bash - PullRequest
0 голосов
/ 17 января 2020

Я просто пытаюсь понять, почему следующее возвращает false:

echo $[ $(( 2100%4 )) == 0 ] --> returns '1'

Я знаю, что, возможно, упускаю что-то простое.

1 Ответ

2 голосов
/ 17 января 2020

Короче говоря, «значение» отличается от «значения».

Нулевой статус выхода означает успех. Ненулевое состояние выхода означает сбой.

Нулевое значение связано с "ложным" логическим состоянием. Ненулевое значение связано с "истинным" логическим состоянием.

[ ... ] совпадает с test .... Команда test завершается с ненулевым состоянием выхода, если выражение внутри ложно (как на самом деле ложь, а не истина). Команда test завершается с нулевым статусом выхода, если выражение внутри имеет значение true.

$[ ... ] является старой, недокументированной и устаревшей формой $(( ... )) arithmeti c расширение (есть также expr ..., который вы не должны использовать).

if expr; then body; fi выполняет часть body, только если expr выходит с нулевым статусом выхода, ie. здесь означает «успех».

Итак:

echo $[ $(( 2100%4 )) == 0 ] 

напечатает 1. $(( 2100%4 )) выполнит арифметическую операцию c и расширится до 0. Расширение arithmeti c работает как на языке C. Результат операции == arithmeti c равен 1, если числа равны, и 0, если числа не равны. $[ 0 == 0 ] выполнит арифметическую операцию c и расширится до числа 1, так как это будет результатом оператора ==.

В то время как:

[ $(( 2100%4 )) == 0 ] 

Выполняет [ 0 == 0 ], то же самое, что test 0 == 0. Поскольку выражение 0 == 0, оцененное командой test, истинно, команда test завершается с 0 статусом выхода, что означает «успех». Обратите внимание, что == является расширением bash для = и выполняет сравнение string , сравнивает 0 с 0 лексикографически. Он не сравнивает числа и отличается от арифметического оператора c.

Существует также синтаксис bash extension (( ... )). (( ... )) вычисляет арифметическое c выражение , и если результат арифметического c равен «истинному» логическому состоянию (ie. Это приводит к ненулевому значению), тогда (( .. )) выходы с нулевым статусом выхода (что означает успех). Если выражение оценивается как 0, ie. «ложное» логическое состояние, затем (( ... )) выходит с ненулевым состоянием выхода. Обратите внимание на разницу.

Таким образом, вы можете:

if (( 2100%4 == 0 )); then something; fi

2100%4 == 0 равно 1, что является "истинным" логическим состоянием, что означает, что (( выходит с нулевой статус выхода, что означает успех, что означает выполнение тела if.

...