Pointer (ke lokasi memori ) sebenarnya bukan konsep yang berguna dalam tingkat apa pun yang lebih tinggi dari C, baik itu sesuatu seperti Python atau shell. Referensi ke objek tentu saja berguna dalam bahasa tingkat tinggi, bahkan mungkin diperlukan untuk membangun struktur data yang kompleks. Tetapi dalam kebanyakan kasus berpikir dalam hal alamat memori level terlalu rendah untuk menjadi sangat berguna.
Di Bash (dan shell lainnya), Anda bisa mendapatkan nilai elemen array dengan ${array[index]}
notasi, menugaskannya, array[index]=...
dan mendapatkan jumlah elemen dengan array ${#array[@]}
. Ekspresi di dalam kurung adalah ekspresi aritmatika. Sebagai contoh buatan, kita bisa menambahkan awalan konstan ke semua anggota array:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(Jika kita hanya peduli dengan nilai, dan bukan indeks, adil for x in "${array[@]}" ; do...
akan baik-baik saja.)
Dengan array asosiatif atau jarang , loop numerik tidak masuk akal, tetapi sebaliknya kita perlu mengambil kunci array / indeks dengan ${!array[@]}
. Misalnya
declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do
echo "${assoc[$i]}"
done
Selain itu, Bash memiliki dua cara untuk menunjuk secara tidak langsung ke variabel lain:
- ekspansi tidak langsung , menggunakan para
${!var}
sintaks , yang menggunakan nilai dari variabel yang nama adalah divar
, dan
- namerefs , yang perlu dibuat dengan
declare
builtin (atau ksh
sinonim -compatible, typeset
). declare -n ref=var
membuat ref
referensi ke variabel var
.
Namerefs juga mendukung pengindeksan, dalam hal ini jika kita miliki arr=(a b c); declare -n ref=arr;
maka ${ref[1]}
akan diperluas ke b
. Menggunakan ${!p[1]}
sebaliknya akan mengambilp
array, dan merujuk ke variabel yang dinamai oleh elemen kedua.
Dalam Bash, nameref secara harfiah adalah itu, referensi dengan nama , dan menggunakan nameref dari dalam suatu fungsi akan menggunakan nilai lokal dari variabel bernama. Ini akan dicetak local value of var
.
#!/bin/bash
fun() {
local var="local value of var"
echo "$ref";
}
var="global var"
declare -n ref=var
fun
BashFAQ memiliki artikel yang lebih panjang tentang tipuan juga.
for foo in "${array[@]}" ; do ... done
kecuali Anda memerlukan indeks untuk tujuan lain.Tidak,
bash
tidak memiliki "pointer", tetapi memiliki referensi:Dari
bash
halaman manual:sumber
Tidak, kerang tidak menggunakan "pointer" (sebagaimana dipahami dalam C).
Array dapat menggunakan indeks:
echo "${array[2]}"
tetapi@
pada contoh Anda sebenarnya bukan "pointer". Ini adalah cara untuk mengekspresikan "daftar nilai array". Sesuatu yang dimengerti oleh parser shell. Mirip dengan cara a:memperluas ke semua daftar "Parameter Posisi".
sumber
Sementara bash integer array yang diindeks dapat didefinisikan & diakses secara iteratif seperti itu;
Array yang diindeks asosiatif atau berbasis string dalam bash memerlukan definisi berulang berikut ini;
Untuk menjawab pertanyaan tentang pointer dan menggunakan satu dari bash; fungsionalitas internal biner bash yang dikompilasi memang menggunakan pointer ke memori yang dialokasikan pada stack dan tidak mengekspos fungsionalitas yang sama dengan penggunaan
eval
. Lihat [referensi tidak langsung] http://tldp.org/LDP/abs/html/ivr.html )Ada naga; penggunaan
eval
harus digunakan dengan hati-hati karena implikasi keamanansumber