Указатель (на область памяти ) не очень полезен для чего-либо более высокого уровня, чем 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 также имеет более длинную статью о косвенности .
for foo in "${array[@]}" ; do ... done
если вам не нужен индекс для других целей.Нет,
bash
не имеет "указателей", но есть ссылки:Со
bash
страницы руководства :источник
Нет, оболочки не используют «указатели» (как это понимается в C).
Массивы могут использовать индексы:
echo "${array[2]}"
но@
в вашем примере это не «указатель». Это способ выразить «список значений массива». Что-то, что понимает парсер оболочки. Похож на способ:расширяется на весь список «Позиционные параметры».
источник
Хотя целочисленные индексированные массивы bash могут быть определены и доступны итеративно, вот так;
Ассоциативные или строковые индексированные массивы в bash требуют следующего итеративного определения;
Ответить на вопрос относительно указателей и использования одного из bash; внутренняя функциональность скомпилированного двоичного файла действительно использует указатели на память, выделенную в стеке, и предоставляет аналогичные функциональные возможности с использованием
eval
. См. [Косвенные ссылки] http://tldp.org/LDP/abs/html/ivr.html ).Там будут драконы; использование
eval
следует использовать с осторожностью из-за последствий для безопасностиисточник