Почему $((true = false)) оценивается до 1 в bash? - программирование
Подтвердить что ты не робот

Почему $((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
4b9b3361

Ответ 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, ложно.