değişken doğru ise döngüde bash betiği


2

Aşağıdaki bash betiğim var:

while [ $loop == "true" ]
   do
     //do stuff
   done

ama [de hata diyor.

Ayrıca bu bir daemon olarak çalışır, stop argümanı betiğe iletildiğinde ... döngü olmalıdır. $ Döngü ayarının false olarak ayarlanmasının otomatik olarak döngüyü sonlandıracağını tahmin ediyorum.


“... [de hata veriyor.” Gerçekten mi?
Ignacio Vazquez-Abrams

Hata mesajını vermemek veya doğru şekilde tanımlamamak için -1 alınız.
JdeBP

Yanıtlar:


1

Bunu yazmanın en iyi yolu şudur:

while [ "$loop" = "true" ]

Aşağıdaki URL'de "Test komutunu çalışmak" bölümünü okuyun:
http://wiki.bash-hackers.org/syntax/quoting


2
Bash'daki tüm değerler dizgedir. Tırnakların bununla hiçbir ilgisi yok.
Ignacio Vazquez-Abrams

2
Tırnaklar çalışmasını sağlar. Ve =, tamsayıları karşılaştıran (örneğin) -eq ile karşılaştırıldığında dizeleri karşılaştırır. Daha fazla bilgi için Gelişmiş Bash komut dosyası Kılavuzdaki "tamsayı ve dize karşılaştırma operatörleri farklı bir dizi kullanmak unutmayın.": Tldp.org/LDP/abs/html/comparison-ops.html
Mattias Ahnberg

Ya da haklısınız, "" kendi içinde bir dize yapmaz, ayrıca kullanabilirsiniz: $ loop = true ancak bash yine de stringler ve tamsayılar arasında fark yaratır. Cevap biraz güncellendi.
Mattias Ahnberg

6
Biliyorsunuz, birisine açıklama yapmadan ve doğru düzelterek yanlış yaptıklarını söylemek anlamsız ve dilsiz midir?
Mattias Ahnberg

1
Veya GreyCat'ın söyleyeceği gibi: Daha Fazla Fiyat Kullanın!
l0b0

5

M. Vazquez-Abrams oldukça haklı. Bu tırnak işareti olan şeyleri kurmak için hiç bir şey değildir zaten dizeleri içine dizeleri veya bazı inatçı bir fikir =içinde bash'ler dahili [komuta bir dize karşılaştırma dışında bir. (Bash Kullanım Kılavuzunun § 6.4'ünü okuyunuz, millet!) Alanlara ayrılmasından sonra boş alanlara olanları, kelimeleri alanlara dönüştürür.

Kabuk değişkeni loopboşsa veya boşsa, $loopboş bir alana genişler. Alan ayrıldıktan sonra boş alanlar atılır. Alan bölmenin ve boş alanların kontrolünün fiyat teklifinin kaldırılmasından önce olduğunu unutmayın . Yani "$loop"alanına genişler ""olduğunu değil boş ve böylece kaldırılmaz. Alıntı kaldırıldıktan sonra boş bir alandır, bu komut için boş bir argüman haline gelir.

[Komut onun gerektirir =iki işlenen, baş ve kıç sahip operatörün. Başka bir şey bir sözdizimi hatasıdır. Boş bir alan kaldırıldığından, sözcüklerin sırası

[$ loop = true]
dört alana genişler

  1. [
  2. =
  3. true
  4. ]

ne zaman [komut ihtiyacı beş sözdizimsel doğru olduğu:

  1. [
  2.  
  3. =
  4. true
  5. ]

Tabii ki, boş dize dört karakterli dizgeye eşit değildir trueve komutun çıkış durumu sıfır değildir.

Yine, bunların tümü, §3.5 ve §3.5.7'deki Bash Kullanım Kılavuzundadır. El kitabı senin arkadaşın.


Oh evet, elbette haklısınız. İyi koymak! Sayın Vazquez-Abrams, kimi açıklamak veya açıklamak için zahmet etmeden birinin yanlış olduğunu işaret eden kibirli yorumlardan olsa da, bu tür düzeltmeler ve açıklamalar için çok teşekkür ederim. Neredeyse yardımcı değil. Dizgeye dönüştürürken kendimi kötü bir şekilde ifade ettim, ancak dizgilerle tamsayılar arasında nasıl döngü oluşturmanız gerektiği konusunda bir fark olduğu anlamına geliyordu. Ve her zaman boşlukları düzgün bir şekilde idare etmek için testlerimi / stringlerimi "" içine koyma alışkanlığım var. :) Ayrıca yanlış olsa da $ loop "true" olarak ayarlanmış olduğunu varsaymıştım.
Mattias Ahnberg
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.