Bash komut dosyasında, beyan ve normal bir değişken arasındaki fark nedir?


43

Bash komut dosyasında:

sadece adlandırarak değişken yaratırız:

abc=ok

ya da kullanabiliriz declare

declare abc=ok

fark ne?

ve bash neden bir değişken oluşturmak için bu kadar çok yol kullanıyor?


6
Bir işlevde kullanıldığında declare, NAME'leri localkomutta olduğu gibi yerel yapar . -gSeçeneği bu davranışı bastırır. Bakın help declare.
Cyrus

2
declareilişkisel diziler, tam sayılar ve salt okunur değişkenler oluşturmayı mümkün kılar. Ayrıca, argümanlarını genişletir, böylece böyle şeyler declare $name=1mümkündür.
choroba

Yanıtlar:


34

Kimden help -m declare:

ADI

    declare - Değişken değerlerini ve niteliklerini ayarlayın.

ÖZET

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

AÇIKLAMA

    Değişken değerlerini ve niteliklerini ayarlayın.

    Değişkenleri bildir ve niteliklerini ver. Hiçbir NAME verilmezse, tüm değişkenlerin niteliklerini ve değerlerini görüntüleyin.

    Seçenekler:

      -f
        eylemi veya gösterimi işlev isimleri ve tanımlarıyla sınırlandırın
      -F
        ekranı yalnızca işlev adlarıyla sınırla (artı hata ayıklama sırasında satır numarası ve kaynak dosya)
      -g
        Bir kabuk fonksiyonunda kullanıldığında global değişkenler oluşturmak; aksi takdirde göz ardı edilir
      -p
        her bir NAME öğesinin niteliklerini ve değerini görüntüleme

    Özellikleri ayarlayan seçenekler:

      -a
        NAME dizine diziler eklenir (eğer desteklenirse)
      -A
        NAME'leri birleştirici diziler yapmak (eğer destekleniyorsa)
      -i
        NAME'lerin 'integer' niteliğine sahip olmalarını sağlamak için
      -l
        NAME'leri atama sırasında küçük harflere dönüştürme
      -n
        NAME değerini, değerine göre adlandırılmış değişkene bir referans yapmak
      -r
        NAME'leri salt okunur yapmak için
      -t
        NAME'lerin 'izleme' niteliğine sahip olmasını sağlamak için
      -u
        NAME'leri atamada büyük harfe dönüştürme
      -x
        NAME'lerin dışa aktarılmasını sağlamak için

    ' +' Yerine ' ' kullanılması -verilen niteliği kapatır.

    İnteger özniteliğine sahip letdeğişkenler, değişkene bir değer atandığında yapılan aritmetik değerlendirmelerde bulunur ( komuta bakınız ).

    Bir işlevde kullanıldığında declare, NAME'leri local komutta olduğu gibi yerel yapar . ' -g' Seçeneği bu davranışı bastırır.

    Çıkma Durumu:
    Geçersiz bir seçenek sağlanmadıkça veya değişken atama hatası oluşmadıkça başarıyı döndürür.

AYRICA BAKINIZ

    Bash (1)

UYGULAMA

    GNU bash, sürüm 4.3.11 (1) - sürüm (i686-pc-linux-gnu)
    Telif Hakkı (C) 2013 Ücretsiz Yazılım Vakfı, Inc.
    Lisans GPLv3 +: GNU GPL sürüm 3 veya üstü <http://gnu.org/ lisans / gpl.html>


Bu yüzden declaredeğişken değerlerini ve niteliklerini ayarlamak için kullanılır .

İki niteliğin kullanımını çok basit bir örnekle göstereyim:

$ # 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

Yukarıdaki örnekte, declaredeğişkenin normal değişken yerine kullanımını anlamanız gerektiğini düşünüyorum ! Bu tür declareişlev, fonksiyonlarda yararlıdır, komut dosyasıyla döngüler.

Ayrıca Typing değişkenlerini de ziyaret edin : bildirmek veya yazı dizisi


evet, "ve öznitelikler" nokta! fark budur.
Ocak'ta 16:48

Harika! Örnekleri, öğretmenin / öğrenmenin en iyi yolunu seviyorum. Teşekkürler!
turkenh

1
Bu cevabı anlamak için "niteliklerin" ne olduğunu bilmeniz gerekir. Bunlar 'integer', 'array' veya 'readonly' gibi değişkenlerin özellikleridir.
Noumenon

11

abc=okdeğişkene bir değer atar abc. declare abcdenilen bir değişkeni bildirir abc. İki olarak birleştirilebilir declare abc=ok.

Bash'da, diğer mermilerde olduğu gibi, dize ve dizi değişkenlerinin bildirilmesi gerekmez; bu nedenle declare, örneğin bir ilişkisel dizi yapmak veya salt okunur bir değişken declare -A abcyapmak abciçin seçenekleri geçmek istemediğiniz sürece gerekli değildir declare -r. Bununla birlikte, bir fonksiyonun içinde declarefark yaratır: değişkenin fonksiyonda lokal olmasına neden olur, yani fonksiyonun dışındaki değişkenin değeri (varsa) korunur. (Siz declare -gdeğişkeni yerel olmayan kılan kullanmıyorsanız ; örneğin declare -gA, bir işlevde genel bir ilişkisel dizi oluşturmak için diğer seçeneklerle birleştirildiğinde kullanışlıdır .) Örnek:

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"

Çıktı:

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

declareYerleşik ile yapabileceğiniz başka bir şey

declareBuiltin Bash özgüdür. Güçlü bir şekilde ilham almış ve ksh'ın typesetyerleşik yapısına çok yakın ve bash uyumluluğun typeseteş anlamlısını declaresağlıyor. (Bash'in neden sadece aramadığını bilmiyorum typeset). Üçüncü bir eş anlamlı var local. Ayrıca export, declare -xuyumluluk için tekrar aynıdır (her Bourne tarzı kabuklu).


Evet! 've seçenek' nokta. ps bash tasarlarsam, "bildir" davranışının farklı koşullarda bir şey yapmasına izin vereceğim. bu işleri kolaylaştırıyor.
Ocak'ta 16:51

Güzel cevap Bir başka sorun, içinde bir export, localve declarediğer kabuklarla en uyumlu?
0xc0de

1
@ 0xc0de export, tüm değişkenlerinde bulunur sh. localsadece bash ve zsh'da, declaresadece bash'ta bulunur. typesetksh, bash ve zsh'da bulunur.
Gilles 'SO- kötü olmayı bırak'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.