Bash ve shell betiği değişken büyük / küçük harflerini düzelt


193

Tüm büyük harflerde değişkenleri olan birçok kabuk komut dosyasıyla karşılaştım ve her zaman bununla ilgili ciddi bir yanlış anlama olduğunu düşündüm. Anladığım kadarıyla, konvansiyonla (ve belki de uzun zaman önce gereklilikle), çevre değişkenleri tamamen büyüktür.

Ancak Bash gibi modern kodlama ortamlarında, her zaman geçici değişkenler için küçük harfli adların ve yalnızca dışa aktarılan (yani ortam) değişkenler için küçük harfli adların kullanılmasını tercih ettim . Örneğin:

#!/usr/bin/env bash
year=`date +%Y`
echo "It is $year."
export JAVA_HOME="$HOME/java"

Bu her zaman bir şeyleri benim almaktır. Bu yaklaşımı kabul eden veya kabul etmeyen yetkili kaynaklar var mı, yoksa yalnızca bir stil meselesi mi?

Yanıtlar:


262

Kongre, ortam değişkenleri (By PAGER, EDITOR, ...) ve iç kabuk değişkenleri ( SHELL, BASH_VERSION, ...) aktifleştirilir. Diğer tüm değişken adları küçük harf olmalıdır.

Değişken adlarının büyük / küçük harfe duyarlı olduğunu unutmayın; bu sözleşme çevresel ve iç değişkenlerin yanlışlıkla geçersiz kılınmasını önler.

Bu kurala uymaktan kaçınmak için UNIX araçları veya kabukları tarafından kullanılan her ortam değişkenini bilmeniz gerekmediğinden emin olabilirsiniz. Değişkeniniz buysa, küçük harf kullanın. Dışa aktarırsanız, büyük harfle yazın.


8
+1. Yanlışlıkla üzerine yazma hakkında iyi bir nokta. Söylemeyi unuttum, ama şimdi söylediğinize göre, sanırım küçük harf kullanmaya karar verdim çünkü sadece bu sorunu okudum veya duydum.
23:23

5
Büyük harf değişken isimlerini kullanmanın ana nedeninin kabuk komutlarıyla çakışmaları önlemek olduğunu düşündüm. Kısa bir süre önce sunucularımızdan birinin ana bilgisayar adını yanlışlıkla '=' olarak değiştirdik çünkü bir komut dosyası 'hostname' değişkeni kullandı.
ThisSuitIsBlackNot

25
@ThisSuitIsBlackNot Crappy kodunu yok sayarak, değişkenler genişletildiğinde bir dolar ile önek olarak eklenir ve kullanılmadığında bir komut adıyla karıştırılamayacakları bir yerde kullanılır. Açıkçası, hostname = moo yapmak sizi başınız belaya sokacaktır. Küçük harfli bir "ana bilgisayar adı" kullandığınız için değil, doğru atama sözdizimini kullanmadığınız için. Atama hostname = moo, boşluk olmadan yapılır. Doğru kod varsayarsanız, komut adlarıyla çakışan değişken adları hakkında endişelenmenize gerek yoktur.
lhunath

3
Baktığım tüm ders kitapları, tüm kabuk değişkenleri için her zaman kullanıcı büyük harfidir. Küçük harfli değişken adlarına izin verilebilirken, büyük harf kuraldır.
Brian S. Wilson

3
Bunu bilmiyordum ve birkaç saat kaybettim. USER="username"bir bash betiği kullanarak ssh yerine bazı uzak komutları otomatikleştiriyor user="username". Ihh! Şimdi biliyorum sevindim!
Gabriel Staples

28

Tutarlı bir şekilde takip edilen adlandırma kuralları her zaman yardımcı olacaktır. Kabuk değişkeni adlandırma için birkaç yararlı ipucu:

  • Kullanım tüm kapaklar ve alt birden çok komut dosyaları veya süreçler arasında paylaşılır, özellikle ihraç değişkenler ve sabitler için. İlgili değişkenlerin öne çıkması ve tümü büyük harf olan Bash iç değişkenleriyle çakışmaması için, uygulanabilir olduğunda ortak bir önek kullanın .

    Örnekler:

    • Ortak önekle dışa aktarılan değişkenler: JOB_HOME JOB_LOG JOB_TEMP JOB_RUN_CONTROL
    • Sabitler: LOG_DEBUG LOG_INFO LOG_ERROR STATUS_OK STATUS_ERROR STATUS_WARNING
  • Tek bir komut dosyasına veya bloğa dahil edilen tüm değişkenler için "yılan durumu" ( tümü küçük harf ve alt çizgi ) kullanın.

    Örnekler: input_file first_value max_amount num_errors

    Yerel değişkenin aşağıdaki gibi bir ortam değişkeni ile ilişkisi varsa karışık durum kullanın: old_IFS old_HOME

  • "Özel" değişkenler ve işlevler için önde gelen alt çizgi kullanın . Bu, özellikle bir kütüphane dosyası içindeki veya dosyalar arasındaki işlevlerin, ana kodda benzer şekilde adlandırılmış herhangi bir şeyle çakışmadan değişkenleri paylaşması gereken bir kabuk kitaplığı yazdıysanız önemlidir.

    Örnekler: _debug _debug_level _current_log_file

  • Deve kasasından kaçının . Bu, vaka yazım hatalarının neden olduğu hataları en aza indirir. Kabuk değişkenlerinin büyük / küçük harfe duyarlı olduğunu unutmayın .

    Örnekler: inputArray thisLooksBAD, numRecordsProcessed,veryInconsistent_style


Ayrıca bakınız:


1
Bu bir sözleşmedir ancak evrensel olarak kabul edilemez. Deve davasının mantığı tamamen ikna edici değil. Dışa aktarılan değişkenler için SHOUTING kullanılması önerisi biraz tartışmalıdır.
tripleee

3
Bunun yaygın olarak takip edilen bir sözleşme olduğunu iddia etmedim. Çoğu programcının kabuk senaryolarındaki güçlü sözleşmeleri takip etmeyi ciddi olarak düşünmediğini ve yaptığım şeylere dayanarak düşüncelerimi not etmeyi düşündüğünü gördüm.
codeforester

8

Kabuk değişkenleri ortama aktarılacaksa, POSIX'in (Sayı 7, 2018 sürümü) Ortam Değişkeni Tanımı şunları belirtmektedir:

POSIX.1-2017 Kabuğu ve Yardımcı Programları birimindeki yardımcı programlar tarafından kullanılan ortam değişkeni adları, yalnızca _Taşınabilir Karakter Kümesinde tanımlanan karakterlerden gelen büyük harf, rakam ve alt çizgi ( ) içerir ve bir rakamla başlamaz.

...

Küçük harf içeren ortam değişkeni adlarının ad alanı uygulamalar için ayrılmıştır. Uygulamalar, standart yardımcı programların davranışını değiştirmeden bu ad boşluğundaki adlara sahip ortam değişkenlerini tanımlayabilir.


6

Ben ne yaparsan yap. Yetkili bir kaynak olduğundan şüpheliyim, ancak oldukça yaygın bir fiili standart gibi görünüyor.


1
Katılıyorum. ALL_CAPS'ın çirkin olması, ancak ÇEVRE DEĞİŞKENLERİNİN çirkin olmasıyla öne çıkması iyidir.
ince

1
Kodlama stili konusunda size katılıyorum, ama kesinlikle yaygın olduğunu kabul etmiyorum! Kabuk komut dosyaları, insanların sadece gayri resmi olarak öğrendikleri yan dillerden biridir ve bu yüzden herkes her zaman LOCATION =cat /tmp/location.txt
JasonSmith

@jhs - Çalışmak zorunda olduğum kabuk komut dosyalarında şanslıydım!
Draemon

4
"Küçük harf içeren ortam değişken adlarının ad alanı uygulamalar için ayrılmıştır." - POSIX IEEE Std 1003.1-2008 bölüm 8.1
üçlü

5

Aslında, "çevre değişkenleri" terimi oldukça yeni bir sikkeye benziyor. Kernighan ve Pike, 1984 yılında yayınlanan "UNIX Programlama Ortamı" adlı klasik kitabında yalnızca "kabuk değişkenleri" nden bahsediyorlar - dizinde "çevre" için bir giriş bile yok!


8
Bu kitabın bir ihmali olduğunu düşünüyorum. getenv (), setenv () ve environ UNIX sürüm 7'de (1979) tanıtıldı. en.wikipedia.org/wiki/Version_7_Unix
Juliano

3
Bu kitap büyük harfli değişkenlerin özel bir anlamı olduğunu belirtiyor.
ashawley

3

Sadece çok yaygın bir kongre, bunun için herhangi bir "yetkili" kaynak olduğundan şüpheliyim.


1

i çevre ve küresel değişkenler için ALL_CAPS kullanmak eğilimindedir. Tabii ki, Bash'te gerçek bir değişken kapsamı yoktur, bu nedenle küresel olarak kullanılan değişkenlerin iyi bir kısmı (çoğunlukla ayarlar ve durum izleme) ve nispeten az sayıda 'yerel' (sayaçlar, yineleyiciler, kısmen oluşturulmuş dizeler ve geçişler)


Evet, kavramsal olarak dışa aktarılmamış değişkenleri yerel olarak düşünüyorum, çünkü Bash sık sık çocuk süreçlerini yapmakla görevlendirilen her şeyi yapmaya zorluyor.
09:19
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.