Kabuk komut dosyalarında değişken atamalardaki boşluklar


17

Aşağıdaki değişken atamaları arasındaki fark nedir?

var=23
var =23
var= 23
var = 23

Atama operatörünün çevresinde boşluk var mı?


Çoğu programlama dilinde bu hiç fark etmez ... Aslında bir fark var mı? Ayrıca burada oldschool sh mi konuşuyorsun? ash / zsh / bash ya da diğer yeni şeyler değil mi?
Cestarian

Yalnızca ilk örnekler bir değişken belirler.
DisplayName

O zaman son 3 sadece bir sözdizimi hatası atmıyor mu? ya da gerçekten bir anlamı var mı?
Cestarian

2
Eğer adı verilen bir komutu varsa @Cestarian onlar bir şey anlamına gelebilir varardından var =23pas olurdu =23var'a ve var = 23geçerdi =ve 23var etmek. Eğer varsa Veya, adlı bir komut var=sonra var= 23geçerdi 23komuta var=.
DisplayName

1
@Cestarian Yerine getirildi bash, shdört vakada olduğu gibi aynı şeyi yapıyor .
pfnuesel

Yanıtlar:


14

Bu çok fazla kabuğa bağlıdır. Sadece 4 ana kabuk ailesine (Bourne, csh, rc, balık) bakarsak:

Bourne ailesi

Yani Bourne kabuğu ve tüm varyantları ve ksh, bash, ash/ dash, zsh, yash.

  • var=23: bu doğru değişken ataması sözdizimidir: tırnaksız harfler, rakamlar veya alt çizgilerden oluşan ve ardından =komut bağımsız değişkeninden önce gelen tırnaksız bir sözcük (burada kendi başına)
  • var =23, bağımsız değişken varile komut =23( komutun yoluna genişleyen özel bir işleç dışında, zshburada =something,something23 geçerli bir komut adı olması muhtemel olmayan ).
  • var= 23: bir ödev ve var=ardından bir komut adı 23. Yani yürütmek için yaratılmış 23olan var=(çevresiyle geçirilenvar boş bir değerle ortam değişkeni).
  • var = 23, ve ile argüman olarak varkomut verin . Örneğin ile deneyin .=23echo = 23

Csh ailesi

cshve tcsh. Değişken atamalar set var = value, skaler değişkenler, set var = (a b)diziler, setenv var valueortam değişkenleri, @ var=1+1atama ve aritmetik değerlendirme sözdizimine sahiptir .

Yani:

  • var=23sadece var=23komutu çağırıyor .
  • var =23varkomutu =23argüman olarak ile çağırıyor .
  • var= 23var=komutu 23bağımsız değişken olarak çağırıyor
  • var = 23varkomutu ile =ve 23argümanlar olarak çağırıyor .

RC Ailesi

Budur rc, esve akanga. Bu kabuklar olarak, değişkenler, diziler ve atamalar ile vardır var = (foo bar)ile, var = fookısa olan var = (foo)(bir ile bir dizi fooelemanı) ve var =kısa var = ()(bir elemanı ile dizi, kullanıcı var = ''boş bir eleman içeren bir dizi için).

Her durumda, boşluklara (boşluk veya sekme) =izin verilir ve isteğe bağlıdır. Yani bu kabuklarda bu 4 komut var = (23)bir eleman olmak üzere bir dizi atamakla eşdeğerdir 23.

Balık

İçinde fish, değişken ataması sözdizimi set var value1 value2. Gibirc , değişkenler dizilerdir.

Bu nedenle, davranış adında olduğu gibi bir komut çalıştırmanıza izin vermemesi cshdışında davranışla aynı fisholacaktır =. Böyle bir komutunuz varsa, örneğin şu şekilde çağırmanız gerekir sh:sh -c 'exec weird===cmd' .

Böylece hepsi var=23ve var= 23size bir hata var =23verecektir, varkomutu =23argüman olarak var = 23çağırır ve varkomutu =ve 23argüman olarak çağırır .


8

var=23değişkene 23 atar var.

var =23komutu (veya diğer adı veya işlevi) varbağımsız değişkenle çalıştırmaya çalışır=23

var = 23ditto, ancak argümanlar =ve23

var= 23varortam değişkenini boş dizeye ayarlar , sonra komutu çalıştırır23

Evet, kabuk bir programlama dili olarak tuhaf. Ancak , uzayların komutları ve argümanları ayırdığı etkileşimli kullanım için bir kabuk olarak mükemmel bir anlam ifade eder . Çoğu "özel karakter" ( =bu durumda), komutlara neredeyse keyfi argümanlara izin vermek için sadece belirli konumlarda özel bir anlama sahiptir.


3
  • var=23 değişkene değer atamak için doğru sözdizimidir.
  • var =23komut variçin =23seçenek / argüman ile komut olarak kabul edilir var(argüman / seçenek için doğru / standart sözdizimi olsa da -optionveya --option)
  • var= 23varbeyaz boşluk atama sürecini bozduğu için hiçbir şey atamaz ve 23başka bir komut olarak kabul edilir. Geçici olduğu var=\ 23ya da var=' 23'beyaz boşluk depolamak için.
  • var = 232. vakada tartışıldığı gibi benzer etkiye sahiptir .

    Aslında bu tür alan kullanımı =genellikle içerideki test koşullarında kullanılır [[ ]]. Bash için örnek:

    string1 = string2
           True if the strings are equal.  = should be used with the test command  for  POSIX  conformance.  
           When used with the [[ command, this performs pattern matching as described above (Compound Commands).

Sonuçta, etrafındaki beyaz boşluğun davranışı, =kabuğunuza ve programlama dillerine bağlıdır.

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.