2012-04-21 3 views
1

При попытке выполнить следующие действия в БашBash ассоциативный массив ошибок

foo=foo 
my_array[$foo]=bar 

я получаю «Баш: Foo: выражение уровня рекурсии превышена (маркер ошибки„Foo“)» ошибки. Но это прекрасно работает:

foo=hello 
my_array[$foo]=bar 

Почему это происходит?

ответ

3

Проблема в том, что вы не объявляете свой массив ассоциативным, поэтому предполагается, что это числовой массив. Когда Баш пытается оценить

my_array[$foo]=bar 

, что он приходит в это

my_array[foo]=bar 

но индекс массива не все еще числовые, поэтому он пытается оценить его снова, приводя в

my_array[foo]=bar 

, так как вам не нужно использовать $, находясь между квадратными скобками. Вы можете видеть, что это продолжается и продолжается до тех пор, пока не будет превышено превышение уровня рекурсии.

Чтобы решить эту проблему, просто объявить массив как ассоциативно:

declare -A my_array 
+0

Спасибо, это решило проблему. Но почему тогда возникает второй пример в моем вопросе? –

+0

Я предполагаю, что когда bash оценивает 'my_array [$ foo] = bar' и расширяет его в' my_array [hello] = bar', то он пытается снова оценить его, но не находит соответствия для $ hello, поэтому предполагает, что он быть литеральной строкой и, таким образом, останавливать оценку, рассматривая массив как ассоциативный. – Win32

+0

@ Win32: Я полагаю, что assings 'bar' до $ {my_array [0]}, он не превращает массив в ассоциативный. – choroba

Смежные вопросы