Указатель (на область памяти ) не очень полезен для чего-либо более высокого уровня, чем 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 также имеет более длинную статью о косвенности .