Почему $((true = false)) оценивается до 1 в bash?
Почему bash имеет следующее поведение?
echo $((true == false))
1
Я бы подумал, что это напечатает 0
, но печатает 1
.
Это дополнительно осложняется следующими фактами:
> echo $((true))
0
> echo $((false))
0
> echo $((true == true))
1
> echo $((false == false))
1
Ответы
Ответ 1
Все плакаты, говорящие о 0, являются истинными, а 1 - ложными, пропустили точку. В этом случае 1 является истинным, а 0 является ложным в обычном булевом смысле из-за контекста оценки арифметики, вызванного $(())
.
Операция ==
внутри $(())
не является равенством возвратных статусов в Bash, она выполняет числовое равенство, используя литералы, где "false" и "true" рассматриваются как переменные, но еще не были которые оба интерпретируются как 0, поскольку они еще не назначены:
$ echo $((true))
0
$ echo $((false))
0
Если вы хотите сравнить возвращаемый статус true и false, вы хотите что-то вроде:
true
TRUE=$?
false
FALSE=$?
if (( $TRUE == $FALSE )); then echo TRUE; else echo FALSE; fi
Но я не уверен, почему вы хотели бы это сделать.
РЕДАКТИРОВАТЬ: Исправлена часть оригинального ответа о том, что "истина" и "ложь" интерпретируются как строки. Они не. Они рассматриваются как переменные, но еще не привязаны к ним.
Ответ 2
Хорошо, так что кажется, что существует большая путаница в отношении того, что действительно делает $((...))
.
Он выполняет арифметическую оценку своих операндов, слова , а не команды или строковые литералы (т.е. true
действительно $true
)) и ничего, что не является числом 0. Оператор ==
сравнивает два числа и возвращает 1, если они равны.
Вот почему $((true == false))
равно 1: в среде нет переменных среды true
или false
, что означает, что $true
и $false
оценивают пустую строку, поэтому 0 в арифметическом контексте!
Чтобы быть полным, вы также можете использовать подстановку команд в арифметическом контексте... Например:
$ echo $((`echo 2`))
2
$ echo $((3 + $(echo 4)))
7
$ a=3
$ echo $((a + $(echo 4)))
7
# undefine a
$ a=
$ echo $((a + $(echo 4)))
4
$ a="Hello world"
$ echo $((a + 1))
1
# undefine a again
$ a=
$ echo $(($(echo $a)))
0
Ответ 3
$ bash --version
GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin13)
$ true="true"
$ unset false
$ if [[ $true ]] ; then echo hi ; fi
hi
$ if [[ $false ]] ; then echo hi ; fi
$ if [[ $true || $false ]] ; then echo hi ; fi
hi
$ if [[ $false || $true ]] ; then echo hi ; fi
hi
$ if [[ $false && $true ]] ; then echo hi ; fi
$ if [[ $true && $false ]] ; then echo hi ; fi
$ if [[ $true == $false ]] ; then echo hi ; fi
$ if [[ $true == $true ]] ; then echo hi ; fi
hi
$ if [[ $false == $false ]] ; then echo hi ; fi
hi`
Ответ 4
Потому что в bash значение 0 истинно, а все, кроме 0, ложно.