Короче говоря, «значение» отличается от «значения».
Нулевой статус выхода означает успех. Ненулевое состояние выхода означает сбой.
Нулевое значение связано с "ложным" логическим состоянием. Ненулевое значение связано с "истинным" логическим состоянием.
[ ... ]
совпадает с 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
.