“Süre:;” ne anlama geliyor?


27

Bir whiledöngünün ne olduğunu biliyorum . Ancak, sadece çalıştığını gördüm:

while [condition]
while ![condition]
while TRUE (infinite loop)

Sonra ifadenin whileya TRUEda olması gerektiği yerde FALSE.

Adında bir kabuk yerleşimi komutu var :. Bu hiçbir şey yapmadan bir kukla komutu olarak tarif edilir, ancak burada aynı ise gerçek olsun bile bilmiyorum TRUEya FALSE. Belki farklı bir şeydir, ama ne?


4
Komut :hiçbir şey yapmaz, ancak her zaman dönüş kodu 0 ile çıkar. Yani, aynıydı while true(sisteminizin trueçalıştırılabilir olduğunu varsayarsak ).
John1024

@ John1024 Argümanlarının değerlendirilmesi, örneğin salt okunur bir değişkene değer atayarak hataya neden olmadıkça sıfır döndürür.
Kusalananda

3
@Kusalananda Evet, eğer :komut asla yerine getirilmezse, 0 döndürmez. Bence bu aşırı derecede bilgiçlik ediyor.
hvd

Yanıtlar:


50

Sözdizimi:

while
  first list of commands
do
  second list of commands
done

Bu, ikinci komut listesini, ilk komut listesi (bu listedeki son çalıştırma) başarılı olduğu sürece döngü içerisinde çalıştırır.

Bu ilk komut listesinde,[ çeşitli testler yapmak için bu komutu kullanabilir ya da :hiçbir şey yapmayan ve başarı döndüren null komutunu ya da başka bir komutu kullanabilirsiniz.

while :; do cmd; done

Her zaman başarıyı döndürdüğü cmdgibi sonsuza dek tekrar tekrar koşar :. Bu sonsuza kadar döngü. Bu truekomutu daha okunaklı hale getirmek için yerine kullanabilirsiniz :

while true; do cmd; done

İnsanlar uzun zaman önce (uzun zaman önce; çoğu kabukları günümüzde yerleşiktir) yapılmadığı zamanlarda her zaman :olduğu gibi tercih ederlerdi.:truetrue

Görebileceğiniz diğer türevleri:

while [ 1 ];  do cmd; done

Yukarıda, ["1" dizesinin boş olmadığını kontrol etmek için komut çağırıyoruz (yani her zaman da doğru)

while ((1)); do cmd; done

C'yi ((...))taklit etmek için Korn / bash / zsh sözdizimini kullanmawhile(1) { ...; }

Ya da daha dolambaçlı olanlar gibi until false; do cmd; done, until ! true...

Bunlar bazen şöyle adlandırılır:

alias forever='while :; do'

Böylece şöyle bir şey yapabilirsiniz:

forever cmd; done

Çok az insan, durumun bir emir listesi olduğunu fark eder . Örneğin, insanların yazdığını görüyorsunuz:

while :; do
  cmd1
  cmd2 || break
  cmd3
done

Ne zaman yazmış olabilirler:

while
  cmd1
  cmd2
do
  cmd3
done

Komut listeleri gibi bir şeyler yapmak istediğinizde bir liste olması mantıklı geliyor while cmd1 && cmd2; do...; done.

Her durumda, [diğerine benzer bir komut olduğunu unutmayın (modern Bourne benzeri mermilerde yerleşik olmasına rağmen), yalnızca if/ while/ untildurum listelerinde kullanılmasına gerek yoktur ve bu koşul listelerinde kullanılmaz. bu komutu diğer komutlardan daha fazla kullanmak için.


¹ :ayrıca daha kısadır ve argümanları kabul eder (ki bu dikkate almaz). Davranış trueveya davranış falsebelirtilmezken herhangi bir argümanı geçerseniz. Yani biri örneğin yapabilir:

while : you wait; do
  something
done

Ancak, davranışı:

until false is true; do
  something
done

belirtilmemiş (çoğu kabuk / falseuygulamada işe yarayacak olsa da ).


12

while :sonsuz bir döngüdür. :sadece hiçbir şey yapmaz (başarıyla).

Eğer kabuğunuzun sonsuza dek hiçbir şey yapmadan durmasını istiyorsanız,

while :
do
    :
done

Veya ;yeni satırlar yerine tek bir satırda :while :; do :; done

while :Özel bir koşul eklenmeden art arda bir şeyler yapmak istiyorsanız genellikle kullanılır. Sen kullanabilir continue, breakonu kontrol etmek veya benzeri döngünün sonuna koşulunu taşımak için döngü içinde açıklamalarda do ... whileyapı.


12

Yine de, bir süre sonra yapılan ifadenin DOĞRU veya YANLIŞ olması gerekir.

Hayır, koşul bölümündeki komut herhangi bir komut (*) olabilir . Tüm kabuk komutları bazı dönüş değerlerine sahiptir ve whiledöngü ( ifkoşullu olduğu gibi ) sıfır değerlerini "true" ve diğerleri "yanlış" olarak alır. (* veya birkaç komutun listesi, sonuncusu sayılır)

Gelince :, Bash kılavuzu bu dönüşü durumunun ne olduğunu açıkça söyler:

: [arguments]
Argümanları genişletmenin ve yönlendirmeleri gerçekleştirmenin ötesinde hiçbir şey yapmayın. Dönüş durumu sıfır.

helpBuiltin daha da açıktır:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.

s/any command/any sequence of commands/, Stéphane'nin belirttiği gibi.
Toby Speight
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.