Вказівник (на місце пам'яті ) насправді не є корисною концепцією в чомусь вищому рівні, ніж C, будь то щось на зразок Python або оболонки. Посилання на об'єкти, звичайно, корисні в мовах високого рівня, можливо, навіть необхідні для побудови складних структур даних. Але в більшості випадків мислення з точки зору адреси пам'яті є занадто низьким рівнем, щоб бути дуже корисним.
У Bash (та інших оболонках) ви можете отримати значення елементів масиву з ${array[index]}позначеннями, призначити їх array[index]=...і отримати кількість елементів у масиві ${#array[@]}. Вираз всередині дужок є арифметичним виразом. Як складений приклад, ми можемо додати постійний префікс для всіх членів масиву:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(Якби ми дбали лише про значення, а не про індекси, просто for x in "${array[@]}" ; do...було б добре.)
З асоціативними або розрідженими масивами числовий цикл не має особливого сенсу, але замість цього нам потрібно буде отримати ключі / індекси масиву ${!array[@]}. Напр
declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do
echo "${assoc[$i]}"
done
На додаток до цього, Bash має два способи опосередковано вказати на іншу змінну:
- непряме розширення , використовуючи в
${!var}синтаксис , який використовує значення змінної, ім'я в var, і
- namerefs , які потрібно створити за допомогою
declareвбудованого (або ksh-сумісного синоніма, typeset). declare -n ref=varробить refпосилання на змінну var.
Namerefs також підтримують індексацію в тому випадку, якщо ми arr=(a b c); declare -n ref=arr;тоді ${ref[1]}будемо розширюватися до b. Використання ${!p[1]}замість цього взяти pяк масив, і посилатися на змінну з ім'ям його другим елементом.
У Bash, namerefs буквально те, що посилання на ім’я та використання nameref зсередини функції використовуватиме місцеве значення названої змінної. Це надрукується local value of var.
#!/bin/bash
fun() {
local var="local value of var"
echo "$ref";
}
var="global var"
declare -n ref=var
fun
BashFAQ також має більш довгу статтю про непрямість .