Apakah declare -a A
buat larik kosong A
di bash, atau apakah itu hanya mengatur atribut jika A
ditugaskan untuk nanti?
Perhatikan kode ini:
set -u
declare -a A
echo ${#A[*]}
echo ${A[*]}
A=()
echo ${#A[*]}
echo ${A[*]}
A=(1 2)
echo ${#A[*]}
echo ${A[*]}
Apa yang seharusnya menjadi keluaran yang diharapkan?
Di Bash 4.3.48(1) saya mendapatkan bash: A: unbound variable
saat menanyakan jumlah elemen setelah declare
.
Saya juga mendapatkan kesalahan itu saat mengakses semua elemen.
Saya tahu bahwa versi Bash yang lebih baru memperlakukan ini secara berbeda.
Saya masih ingin tahu apakah declare
sebenarnya mendefinisikan sebuah variabel (dikosongkan).
Jawaban yang Diterima:
Itu tergantung apakah variabel terkait telah dideklarasikan dalam lingkup saat ini (tingkat atas alias fungsi global atau saat ini) sebelumnya.
Jika belum dideklarasikan dalam cakupan saat ini (dan berhati-hatilah karena dalam cakupan tingkat atas, variabel mungkin telah dideklarasikan (dan ditugaskan) dengan mengimpornya dari lingkungan), kemudian mendeklarasikannya (menjadikannya lokal ke fungsi ketika dalam lingkup fungsi), menetapkannya sebagai tipe, tetapi tidak menginisialisasi, bahkan ke daftar kosong (declare -p a
menunjukkan declare -a a
, bukan declare -a a=()
seperti jika Anda telah mendeklarasikan dan/atau menugaskannya dengan a=()
).
Jika sudah dideklarasikan dalam lingkup saat ini (misalnya karena diimpor sebagai variabel skalar dari lingkungan saat dalam lingkup global), maka declare -a a
akan mencoba untuk mengkonversi ke array.
Jika sebelumnya skalar, maka menjadi ([0]=value-of-the-variable)
Himpunan. Jika sudah menjadi array, tidak akan tersentuh. Jika itu adalah array asosiatif, gagal dengan cannot convert associative to indexed array
kesalahan.
Perhatikan bahwa declare
tidak akan mengonversi array atau hash ke skalar. bash
tidak akan dapat mengonversi hash/array ke skalar. Anda dapat menggunakan declare +aA a
untuk memaksa skalar (yang akan gagal dengan kesalahan jika variabel sebelumnya adalah hash/array dalam cakupan saat ini).
Dalam kasus Anda, variabel itu mungkin belum dideklarasikan dalam cakupan saat ini, sehingga akhirnya dideklarasikan tetapi tidak ditetapkan yang menjelaskan mengapa mencoba memperluasnya gagal di bawah set -u
.
Perbedaan antara dua dinyatakan dan ditugaskan /setel status variabel tidak spesifik untuk bash
. Dalam POSIX sh
, Anda juga dapat export
variabel atau membuatnya readonly
tanpa memberikan nilai.
$ sh -uc 'unset -v var; readonly var; : "$var"'
sh: 1: var: parameter not set
Perhatikan bahwa unset
baik unsets dan undeclares variabel. Di bash
, mksh
dan yash
itu dapat memulihkan variabel dari lingkup luar.
Dalam zsh
, kecuali di sh
emulasi, menggunakan typeset
pada variabel mendeklarasikan dan menyetelnya ke nilai kosong jika belum disetel atau disetel tetapi dari tipe yang berbeda (skalar vs array vs array asosiatif).