"İf` ve" then "programları gerçekten


15

Noktalı virgüllerin programları ayırmak için kullanıldığını okudum:

$ echo 3; ls -la

O anlamına mı if, thenve elseayrı programlar burada?

$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi

Bu soru noktalı virgülle ilgili değildir.



1
@StephenRauch Gerçekten bir kopya değil. Dahası, bu Q'dan, daha fazla anlama girişimi olarak makul bir büyüme.
user207673

Daha fazla program-y formülasyonu:[ $variable == abcdef ] && echo yes || echo no
Hagen von Eitzen

2
@HagenvonEitzen kesinlikle eşdeğer değildir, ilk daldaki ifade başarısız olursa, ikincisi de yürütülür.
Morgen

Yanıtlar:


26

;Ayırır ifadeleri (gevşek konuşma). ;A'yı bir satırsonu ile değiştirmek (neredeyse) her zaman mümkündür .

Bu ;nedenle, iki programı ayırmak ifve then"programlar" olması gerektiğini söylemek, ayrılmış kelimeler, kabuk işlevleri, yerleşik yardımcı programlar ve harici yardımcı programlar ve bunların boru ve boolean operatörleri vb. . vb.

Hem ifve thenkelimeleri saklıdır kabuk dilbilgisi değil, "programları". Burada, teknik olarak bileşik komut olarak adlandırılan şeyi oluşturmak için kullanılırlar .

echobüyük olasılıkla kabukta yerleşik bir yardımcı programdır (ancak böyle olması gerekmez) ve lsmuhtemelen harici bir yardımcı programdır (veya dediğiniz gibi "program" dır).


7

Bu, kabukları kullanmanın temellerini öğrenmeye başlarken adil bir ilk yaklaşım olsa da, "işte bir program nasıl çalıştırılır" ve "işte tek bir satırda birden çok programı birbiri ardına nasıl çalıştırır" düzeyinde , aslında doğru değil.

Yeni başlayanlar için anlaşılması daha zor ama daha doğru bir açıklama, kabuk dilinin bir bilgisayar dili olduğudur . Bu bir var sözdizimi . Bu sözdizimi (diğer şeylerin yanı sıra) yeni satırlar, operatörler, kelimeler ve ayrılmış kelimeler dahil olmak üzere çeşitli sözcüksel öğeler içerir .

if, then, elseVe fihepsi ayrılmış kelimeler . Birisinin kabuğuna verdiği girişi ayrıştırırken dilbilgisine göre özel anlamları vardır . Benzer şekilde, ;bir ayırıcı operatördür .

Kabuk dilindeki girdi, bir bütün olarak, başka bir program, bir tercüman ve kabuk tarafından yorumlanan bir bilgisayar programı olarak alınır . Tek tek gramer bölümleri program değildir. Kabuk dili, kabuğun çalışması için (diğer) programları belirtmenin bir yoludur.

[kabuk dilbilgisinde operatör gibi özel bir sözcük öğesi değildir. Bu tür bir programa ad veren sıradan bir kelimedir[ . Birçok kabuk , bu programın yerleşik bir sürümüne sahiptir ve kabuk programının kendisinin koduyla birleştirilir, ancak bu adla veya kabuklar dışındaki programların çağırabileceği bir yerde harici bir program da bulabilirsiniz . Aynı şekilde, özel bir kabuk sözcüksel öğesi de değildir. Bu sıradan bir kelime, bu program için bir argüman haline geliyor . Program nihai argüman, yürütüldüğünde, olmasını gerektirir o zaman görmezden ilerler, hangi./bin/[/usr/bin/[][[]

Sorunuzda adlandırılan benzer başka bir program echo. Yine, çoğu kabuk bu programın yerleşik bir versiyonuna sahiptir. Ama yine bir yerde gibi, aynı zamanda programın harici sürümü var /bin/echoya /usr/bin/echo, programlar için diğerinden daha kabukları çağırmak için.

Sorunuzda adı geçen üçüncü bir program ls. Kabuklar genellikle bu programın yerleşik sürümlerine sahip değildir ve /bin/lsveya gibi bir yerde bulunan harici bir programdır /usr/bin/ls.

Bourne Again kabuğu için, daha fazla bilgiyi GNU Bourne Again kabuğu bilgi belgelerinin Temel Kabuk Özellikleri bölümünde bulabilirsiniz. Diğer mermilerin doğal olarak farklı dilbilgileri vardır. Tek Unix Şartname (kendi POSIX conformant modlarda olarak) tüm POSIX conformant kabukları uymaları istenirken bir kişilik sözdizimi.

daha fazla okuma

  • " Kabuk Dilbilgisi ". Kabuk Komut Dili . Temel Özellikler Sayı 7. Açık Grup. IEEE 1003.1-2008. ISBN 1937218812.
  • test. Kamu hizmetleri . Temel Özellikler Sayı 7. Açık Grup. IEEE 1003.1-2008. ISBN 1937218812.
  • " Kabuk Dilbilgisi ". Z Kabuk El Kitabı . sürüm 5.3.1. 2017.

5

Aslında düşünmek zoraki değil if, thenve elseharici programlar gibi. Aslında, orijinal 1. baskı Unix'te Thompson kabuğu ifve gotoharici programlar olarak uygulandı . Bu mümkündür, çünkü alt işlem dosya tanımlayıcılarını kabuk işlemi ile paylaşır, bu nedenle (ileri) bir goto hedef etiketi bulana ve sonra çıkana kadar girdiyi okumak zorunda kaldı. Bkz. Thompson kabuğu .


Ya da gerçekten Laurent Bercot'un ifve ifelsebunun bir parçası olanları görün execline. Ancak bunlar söz konusu değil if.
JdeBP

2
“Aslında, o zaman ve başka bir şey harici programlar olarak düşünmek çok zor değil” Eh, öyle, çünkü değiller.
Monica ile Hafiflik Yarışları

2

thenVe elseprogramlar değiller. Diğer kısımlar. ;Doğrudan onların peşinde ' hayır ' olduğuna dikkat edin , ama komuttan sonra gelirler.

[ ... ] Olan bir komut ve ihtiyacı ;başka komutun başında izledi eğer.

AFAIK, Bash'teki tüm kontrol yapıları ve muhtemelen çoğu * nix mermileri aynıdır. Onlar tercümana talimattır. Test veya koşul ise "yürütülmüş" ve komut olan bir program / işlem kullanır. Yana thenyol açtığı hattının bir parçasıdır echosahip olduğu komut önceki komut bir satır ile ayrılacak [ ... ]. Kontrol ettiği komuttan ayrılması gerekmez echo yes.

Yasal olarak, çirkin ve okunması zor olsa da, bunu da yapabilirsiniz.

if [ $VARIABLE == abcdef ]
then echo yes
else echo no
fi

;Kendi hatlarında olmasalar bile, burada kontroller arasında hiç bir şeye ihtiyaç olmadığına dikkat edin .

İlginç bir şekilde, tüm kontrol yapısı ( if ... fi) bir kabuk komutudur ve bütünlük bir satırsonu veya a ile bitmelidir ;. Son satır olamaz fi echo doneama olmalı fi; echo done. Ödev VARIABLE='abcdef'ile aynı komuttur.

Bütün kontrol yapıları komut olmasına rağmen hala program değildirler.


1

if, elif, thenVe fiyapılardan birini uygulamak için kullanılan tüm ayrılmış anahtar kabuğu bu isimlerin herhangi biri ile (daha doğrusu, başka bir komut), bir komut olması anlamına gelir kabuk içinde bir bileşik komutu olarak ifade edilir. Genelin amacı ;komutları ayırmak değil, bir komut listesini sonlandırmaktır . Örneğin, aşağıdakiler geçerliif ifadedir:

if echo foo; echo bar; echo baz; then echo done; echo really done; fi

İfadenin durumu ifkomut listesidir echo foo; echo bar; echo baz. Ayrıştırıcı, koşulun sona erdiğini bilir, çünkü noktalı virgülün thenhemen ardından gelen bir komut olamaz çünkü ayrılmış bir anahtar sözcüktür. Böylece, takip eden şeyin thenvücudun başlangıcı olduğunu bilir . Benzer şekilde, fiayrılmış bir anahtar kelimedir ve bu nedenle ififadenin gövdesinde üçüncü bir komut olamaz , ancak bileşik komutun sonunu işaretler.


teşekkürler, eğer bu kullanılırsa if program1 foo; program2 bar; program3 baz; , hangi program durumu olmalı 0, böylece kabuk devam eder then? Sonuncu?
Maxim Koretskyi

Sadece program3 baz. Bir komut listesinin çıkış durumu, o listedeki son komutun çıkış durumudur. Diğer ikisi durumu etkilemeden başarısız olabilir.
chepner
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.