GNU/Linux >> Belajar Linux >  >> Linux

Apakah `deklarasikan -a A` Membuat Array Kosong `a` Di Bash?

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.

Terkait:Mengapa ls -l tidak menunjukkan waktu dan atau tahun untuk setiap file??

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).


Linux
  1. Nama Variabel Bash Dinamis (variabel)?

  2. Bagaimana Cara Membuat Array Elemen Unik Dari String/array Di Bash?

  3. Perintah Rm Dalam Skrip Bash Tidak Bekerja Dengan Variabel?

  1. Skrip bash(I)

  2. Bash Array Dari Array?

  3. Alias ​​​​dengan variabel di bash

  1. Apakah ~ Selalu Sama dengan $home?

  2. Kurung Tunggal Dalam Penugasan Variabel Bash?

  3. bash:masukkan file daftar ke dalam variabel dan tetapi ukuran array adalah 1