Dalam bash scripting, apa perbedaan antara mendeklarasikan dan variabel normal?

43

Dalam skrip bash:

kami membuat variabel hanya dengan memberi nama:

abc=ok

atau bisa kita gunakan declare

declare abc=ok

apa bedanya?

dan mengapa bash membuat banyak cara untuk membuat variabel?

lovespring
sumber
6
Saat digunakan dalam suatu fungsi, declarejadikan NAMA lokal, seperti dengan localperintah. The -gopsi menekan perilaku ini. Lihat help declare.
Cyrus
2
declarememungkinkan untuk membuat array asosiatif, bilangan bulat, dan variabel hanya baca. Juga, ia memperluas argumennya, jadi hal-hal seperti declare $name=1itu mungkin.
choroba

Jawaban:

34

Dari help -m declare:

NAMA

    declare - Tetapkan nilai dan atribut variabel.

RINGKASAN

    declare[ -aAfFgilnrtux] [ -p] [ name[ ] ...]=value

DESKRIPSI

    Tetapkan nilai dan atribut variabel.

    Deklarasikan variabel dan berikan mereka atribut. Jika tidak ada NAMA yang diberikan, tampilkan atribut dan nilai semua variabel.

    Pilihan:

      -f
        batasi tindakan atau tampilan untuk fungsi nama dan definisi
      -F
        batasi tampilan hanya untuk nama fungsi (ditambah nomor baris dan file sumber saat debugging)
      -g
        membuat variabel global saat digunakan dalam fungsi shell; jika tidak diabaikan
      -p
        tampilkan atribut dan nilai setiap NAME

    Opsi yang mengatur atribut:

      -a
        untuk membuat NAME array yang diindeks (jika didukung)
      -A
        untuk membuat array asosiatif NAME (jika didukung)
      -i
        untuk membuat NAME memiliki atribut 'integer'
      -l
        untuk mengonversi NAME menjadi huruf kecil saat penugasan
      -n
        jadikan NAME referensi ke variabel yang dinamai nilainya
      -r
        untuk membuat NAME dibaca hanya
      -t
        untuk membuat NAME memiliki atribut 'jejak'
      -u
        untuk mengonversi NAME menjadi huruf besar saat penugasan
      -x
        untuk membuat NAME mengekspor

    Menggunakan ' +' alih-alih ' -' mematikan atribut yang diberikan.

    Variabel dengan atribut integer memiliki evaluasi aritmatika (lihat letperintah) dilakukan ketika variabel diberi nilai.

    Saat digunakan dalam suatu fungsi, declarejadikan NAMA lokal, seperti dengan local perintah. Opsi ' -g' menekan perilaku ini.

    Status Keluar:
    Mengembalikan sukses kecuali jika opsi yang tidak valid disediakan atau kesalahan penugasan variabel terjadi.

LIHAT JUGA

    bash (1)

PELAKSANAAN

    GNU bash, versi 4.3.11 (1) -release (i686-pc-linux-gnu)
    Hak Cipta (C) 2013 Free Software Foundation, Inc.
    Lisensi GPLv3 +: GNU GPL versi 3 atau lebih tinggi <http://gnu.org/ lisensi / gpl.html>


Jadi, declaredigunakan untuk mengatur nilai variabel dan atribut .

Biarkan saya menunjukkan penggunaan dua atribut dengan contoh yang sangat sederhana:

$ # First Example:
$ declare -r abc=ok
$ echo $abc
ok
$ abc=not-ok
bash: abc: readonly variable


$ # Second Example:
$ declare -i x=10
$ echo $x
10
$ x=ok
$ echo $x
0
$ x=15
$ echo $x
15
$ x=15+5
$ echo $x
20

Dari contoh di atas, saya pikir Anda harus memahami penggunaan declarevariabel atas variabel normal! Jenis declareasi ini berguna dalam fungsi, loop dengan scripting.

Kunjungi juga variabel Pengetikan: mendeklarasikan atau mengeset

Pandya
sumber
ya, "dan atribut" adalah intinya! ini bedanya.
lovespring
Besar! Saya suka contoh, cara terbaik untuk mengajar / belajar. Terima kasih!
turkenh
1
Anda perlu tahu apa "atribut" untuk memahami jawaban ini. Mereka adalah properti dari variabel seperti 'integer', 'array', atau 'readonly'.
Noumenon
11

abc=okmemberikan nilai ke variabel abc. declare abcmendeklarasikan variabel yang dipanggil abc. Keduanya dapat digabungkan sebagai declare abc=ok.

Dalam bash, seperti shell, variabel string dan array lainnya tidak perlu dideklarasikan, jadi declaretidak perlu kecuali Anda ingin meneruskan opsi, misalnya declare -A abcuntuk membuat abcarray asosiatif atau declare -rmembuat variabel read-only. Namun, di dalam suatu fungsi, declaremembuat perbedaan: itu menyebabkan variabel menjadi lokal ke fungsi, yang berarti bahwa nilai variabel di luar fungsi (jika ada) dipertahankan. (Kecuali jika Anda menggunakan declare -g, yang membuat variabel tidak lokal; ini berguna ketika dikombinasikan dengan opsi lain, misalnya declare -gAuntuk membuat array asosiatif global dalam suatu fungsi.) Contoh:

f () {
  declare a
  a='a in f'
  b='b in f'
  echo "From f: a is $a"
  echo "From f: b is $b"
}
a='Initial a'
b='Initial b'
f
echo "After f: a is $a"
echo "After f: b is $b"

Keluaran:

From f: a is a in f
From f: b is b in f
After f: a is Initial a
After f: b is b in f

Hal lain yang dapat Anda lakukan dengan declarebuiltin adalah

The declarebuiltin unik untuk bash. Ini sangat terinspirasi dan sangat dekat dengan typesetbuiltin ksh , dan bash menyediakan typesetsebagai sinonim declareuntuk kompatibilitas. (Saya tidak tahu mengapa bash tidak hanya menyebutnya typeset). Ada sinonim ketiga local,. Ada juga export, yang sama dengan declare -x, lagi untuk kompatibilitas (dengan setiap shell gaya Bourne).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
iya nih! 'dan opsi' adalah intinya. ps jika saya merancang bash, saya akan membiarkan perilaku "menyatakan" melakukan beberapa hal dalam kondisi berbeda. ini membuat semuanya menjadi sederhana.
lovespring
Jawaban bagus. Pertanyaan selanjutnya, yang mana di antara export, localdan declareyang paling kompatibel dengan cangkang lain?
0xc0de
1
@ 0xc0de exportada di semua varian sh. localhanya ada di bash dan zsh, declarehanya di bash. typesetada di ksh, bash dan zsh.
Gilles 'SANGAT berhenti menjadi jahat'