Сколько уровней косвенного нарушения я могу подать заявку в Bash?

2 ответа

На самом деле, в Bash есть еще один способ косвенного обращения, по крайней мере, эффективный :Если у вас есть a=1и b=a, вы можете получить значение от aдо bвот так:

eval echo \${$b}

Можно вкладывать несколько раз:

$ a=1; b=a; c=b; d=c
$ eval eval eval echo \\\\\\\${\\\${\${$d}}}
1

Вот правила определения правильного количества обратных косых черт на каждом уровне:

  1. На самом внутреннем уровне обратная косая черта не используется.
  2. На любом другом уровне используйте 2 n + 1 обратную косую черту, где n — количество обратных косых черт, используемых на следующем внутреннем уровне.

Обоснование :Правило 1 тривиально. Правило 2 исходит из того, что вам нужно применить на одну обратную косую черту больше, чем на следующем внутреннем уровне, в то время как вы должны экранировать все те, которые не потребляются на текущем уровне, то есть все, кроме одного.

Как следствие, количество необходимых обратных косых черт экспоненциально расходится с увеличением количества уровней, так что вложенность достигает своего предела для этого метода довольно скоро.

Но здесь следует подчеркнуть, что этот предел носит скорее академический характер. На практике, когда нужно уважать такие потребности, как ремонтопригодность,обычно не требуется обрабатывать более двух или трех уровней косвенности в одном выражении — независимо от того, какой метод косвенности используется.

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

value=${variable}
variable=${!value}

количество раз, подходящее для данного приложения.

0
27.01.2020, 22:29

Существует (большая )косвенная косвенность, разрешенная непосредственно в арифметическом расширении только для чисел .

$ a=123 b=a c=b d=c e=d ; echo $((e))
123

вы можете расширить его с помощью объявления:

$ jj=123; for ii in {a..f}{a..z}; do declare $ii=$jj; jj=$ii; done; echo "$((ii))"
123

Но оно не бесконечно:

$ jj=123; for ii in {a..z}{a..z}; do declare $ii=$jj; jj=$ii; done; echo "$((ii))"
bash: tz: expression recursion level exceeded (error token is "tz")

Достаточно?

0
27.01.2020, 22:29

Теги

Похожие вопросы