Bash приводит к неожиданной рекурсии при обработке выражения внутри [[ - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь понять логику алгоритма Bash.

Когда я попробовал это, он напечатал «a»:

a=a;[ $a == "a" ] && echo $a

Пока все хорошо.Затем я попробовал следующее, и он снова напечатал «a»:

a=a;[[ $a == "a" ]] && echo $a

Теперь я ввел ошибку, используя арифметическое сравнение:

a=abc;[ $a -eq "abc" ] && echo $a

Я получил сообщение об ошибке, которое имеет смысл:

-bash: [: abc: integer expression expected

Затем я попытался сделать это с двойной скобкой и не получил ошибки, но "abc":

a=abc;[[ $a -eq "abc" ]] && echo $a

Я могу это как-то объяснить (bash пытается быть любезен), но потом я получил кое-что, что озадачивает меня.Если я это сделаю, я получу сообщение об ошибке рекурсии:

a=a;[[ $a -eq "a" ]] && echo $a

-bash: [[: a: expression recursion level exceeded (error token is "a")

Если я использую одиночные скобки, рекурсия не возникает, но существует разумная ошибка "ожидается целочисленное выражение":

a=a;[ $a -eq "a" ] && echo $a
-bash: [: abc: integer expression expected

Это странно.Что Bash пытается сделать в этом «рекурсивном» случае с двойными скобками?Я говорю о:

a=a;[[ $a -eq "a" ]] && echo $a
-bash: [[: a: expression recursion level exceeded (error token is "a")

1 Ответ

0 голосов
/ 17 декабря 2018

Он пытается привести a в числовую форму.Это делается путем обработки его содержимого как имени переменной с разыменованием;когда результатом является цикл, вы получаете ошибку «превышен уровень рекурсии».

Таким образом:

a=b
b=10
[[ $a -eq 10 ]]

... имеет значение true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...