Bir bash davası ifadesinin sonunda “esac” ne anlama geliyor? Gerekli mi


55

Bir bash case ifadesinin sonunda beliren birden fazla "esac" örneği buldum, ancak kullanımı hakkında net bir belge bulamadım. Man sayfası onu kullanır ve hatta kelimesi üzerinde bir indeks içerir ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ), ancak kullanımını tanımlamaz. Bir vaka ifadesini, en iyi uygulamayı veya saf tekniği sonlandırmanın gerekli yolu mu?


2
esacTam olarak nerede olması gerektiğine işaret eden dizin girişi - onu tanımlayan satıra ve gerekli olduğunu gösterir.
Hobbs

@hobbs, endeksin kullanımını gösteren çizgiye işaret ettiğini doğrular ancak özellikle "|" gibi diğer karakterlerin kullanımını açıklayana kıyasla herhangi bir şekilde tanımlamaz veya ";" veya ";;". Şimdi cevapları okuduğuma göre, geriye doğru hecelenen "vaka", çoğu deneyimli kullanıcının bunu kabul etmesi için alacağı komutları bitirmek için böyle bir fiili standart gibi görünüyor.
GrnMtnBuckeye 20:16

Eğer sahip değildiniz esacveya buna benzer bir şey yapmazsanız, caseifadenin sonunun nerede olduğunu söyleyebileceğini nasıl düşünürsünüz ?
Barmar

Bu söz diziminin bir parçası olarak tanımlar caseaynı şekilde, açıklamada else, elifve fibir sözdizimi bir parçası olarak tanımlanır iftablosu. Kendi kendine ait bir semantiği yok, bu yüzden söylenecek bir şey yok, ama bir caseifadenin tanımının sonunda, bir caseifadenin bittiği yerde. caseGeriye doğru hecelenmesi gerçeği uygun bir merak, ama bilgisayar umursamıyor, sadece belli bir kelime aradığını biliyor.
16'da

1
@ hobbs "... bunun hakkında söylenecek bir şey yok ..." henüz bununla ilgili söyleyecek hiçbir şeyin olmadığını açıklayan bir paragraf yazdınız. Önemli olan sadece "esac" ın amacını anlamak. Bu nedenle, bu sorunun oldukça fazla sayıda oy ile doğrudan bir cevabı var.
Angelo

Yanıtlar:


99

Gibi fiiçin ifve doneiçin for, esacbir son vermek gerekli yoludur casedeyimi.

esacolduğu casegeriye yazıldığından ziyade sever fiedilir ifgeriye yazıldığından. Bir forblok biten simgenin neden olmadığını bilmiyorum rof.


33
Neden odbir dobloğu bitirmiyorsun demek istiyorsun ? :)
Wildcard,

4
\odBu yardımcı programı kullanmak istediğiniz her zaman yazmak zorunda olduğunuzu düşünün !
Nadirdir

2
Seni 666'dan çıkardım. Bir şey değil: P. Ve harika cevap!
Wanderer

12
@Wildcard Olur five olmaz neht, bu yüzden analojiyle olur rof(veya elihw) ve olmaz od(ayrıca elbette odzaten alınır) ... ama belki de bu en tutarlı olmayan dillerden birinin kendinden çok tutarlı olması bekleniyor var.
zwol

1
ROTFL söyleyecek başka bir şey yok
gerhard d.

55

esacAnahtar kelime gerçekten sona erdirmek için gerekli ayırıcı olduğu casedeyimi bashhariç Unix / Linux üzerinde kullanılan ve en kabukları cshailesi.

Orijinal Bourne kabuğu , daha önce ALGOL68'de çalışan Steve Bourne tarafından yaratıldı . Bu dil, blokları sınırlamak için bu ters kelime tekniğini icat etti.

case/esac

if/fi

do/od

İkincisi daha do/odancak do/doneBourne dahil olmak üzere tüm türetilen kabuklar bashiçin odzaten kurulduğu (yana bir UNIX komut olarak mevcut olan O ctal d UMP ).

Not do/doneişlevsel bloklar biri tarafından tanıtıldı for, whileya untiltalimatlar. for, whileVe untilşekilde sona gerekmez doneyeterlidir. Varsayım rofve elihwbelirteçlere ihtiyaç duyulmamasının nedeni budur .


6

" esac" Önceki bir sonlandırır " casebir" oluşturmak üzere " kod bloğu ".

Algol68'de kullanılırlar, genellikle tanıtıcı anahtar kelimenin tersine çevrilmiş karakter dizisi, örneğin muhafazayı sonlandırmak için kullanılır; ( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).

Edsger Dijkstra ve Korunan Komuta Dilinden sonra onlara "Korunan Bloklar" diyecektim .

odBourne Kabuğunda muhtemelen Unix "od" komutunun varlığından dolayı kullanılmadı .

Tarih:

"Guarded Block" fikri ALGOL 68'den geldi, örneğin İngilizce:

proc days in month = (int year, month)int:

  case month in
    31,
    if year mod 4=0  year mod 1000    year mod 400=0 then 29 else 28 fi,
    31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  esac;

Sovyet'in Algol68 LGU uygulaması da aynı şeyi yaptı: İngilizce'de, Algol68'in saygılı durum açıklaması case ~ in ~ out ~ esac, Kiril dilinde okur выб ~ в ~ либо ~ быв.

Daha sonra 1975'te Algol68'in kod blokları , Korunan Komuta Dili için Edsger Dijkstra tarafından ödünç alındı . Örneğin

if a  b  max := a
| b  a  max := b
fi

Muhtemelen Dijstra , Algol60'da uygulanan ve daha sonra C Programlama Dilinde yeniden tasarlanan Dangling'in belirsizliğini aşmak için "Korunan Blokları" kullandı . (bkz. vardiya azaltma çatışması )

Sonunda - Algol68'den - " esac", ALGOL 68C adlı bir erken Algol68 derleyicisi geliştiren Stephen R. Bourne'un izniyle 1977 Bourne kabuğuna (keşfettiğiniz yer esac) girmiştir .

Ünlü Stephen ayrıca aynı Guarded Bloklarını macro.h adlı bir "C başlık dosyasında" da kullandı.

#define IF  if(
#define THEN    ){
#define ELSE    } else {
#define ELIF    } else if (
#define FI  ;}

Dikkat çekici yazılım dahileri Landon Curt Noll ve Larry Bassel , 1984 yılında Steve'in macro.h koduna girerek National Semiconductor'ın Genix liman grubunda çalıştı ve uygulamalarını anlamakta zorlandı. Ve böylece Landon & Larry daha sonra Uluslararası Şaşkın C Kod Yarışması'nı yarattı ...

1984'ten günümüze Dijkstra'nın Korunan Komutlarını kullanmayan binlerce başka "daha iyi" programlama dili daha vardı. Ve Steven Bourne'un bunları kullanması macro.h, şimdi genellikle BT mezunlarının "Yazılım Geliştirme Tezleri" nde derslerde uyumadıklarının kanıtı olarak gösteriliyor. :-)


Nedir case out? bu sözdizimini hiç görmedim
Dani_l

1
@Dani_l Bu, bourne kabuğu tarafından benimsenmeyen Algol68 sözdizimidir.
jlliagre

odDaha önce alınmamış olsa bile neden çağırıyorlar ? O olmaz rofya elihw?
flarn2006

Picking do ~ od, if ~ five case ~ esacbasitçe undergrads sonsuz gelecek nesillere Algol68 düşünmek ve aslında bir sayfaya (hat?) Algol68 kodunun daha sonra yazmak zorunda kalmadan, nihai yıl projeye Algol68 basit "eleştirisini" eklemek mümkün olacağı anlamına gelir.
NevilleDNZ

1

Evet, gerekli. Jacob Yukarıda işaret ettiği gibi, bunun mantığı ile aynıdır if/ ' fi. Geleneksel C yorumlayıcıları sınırlandırır /*ve */benzer şekilde eşleşir C, Unix'in çoğunlukla C dilinde yazılabildiği için, minimum montaj kodu ile, C ve Unix geliştirme ekipleri arasında büyük bir örtüşmeyle birlikte, çok ortak bir kapanış eşdeğeri olduğu fikrinin ortak bir kaynağını kabul etmek mantıklıdır. karakter bloğu sınırlayıcı, ters sırayla aynı karakter dizisi olmalıdır.

Buna karşılık, benzer döngüler for, whileve untilkullanımını do... doneyerine karakter sırasını tersine çeviren, böylece orada bazı tutarsızlık.


3
Sözdizimi, yine ALGOL'den ilham alan Bourne'dan geldi.
Runium,
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.