Apa arti "esac" di akhir pernyataan kasus bash? Apakah itu wajib?

55

Saya telah menemukan beberapa contoh "esac" yang muncul di akhir pernyataan bash case tetapi saya belum menemukan dokumentasi yang jelas tentang penggunaannya. Halaman manual menggunakannya, dan bahkan memiliki indeks pada kata ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ), tetapi tidak mendefinisikan penggunaannya. Apakah ini cara yang diperlukan untuk mengakhiri pernyataan kasus, praktik terbaik, atau teknik murni?

GrnMtnBuckeye
sumber
2
Entri indeks untuk esactitik tepat di mana seharusnya - ke garis yang mendefinisikannya dan menggambarkan bahwa itu diperlukan.
hobbs
@obbs, Anda benar bahwa indeks menunjuk ke garis yang menggambarkan penggunaannya tetapi tidak mendefinisikannya dengan cara apa pun, terutama dibandingkan dengan cara itu menggambarkan penggunaan karakter lain seperti "|" atau ";" atau ";;". Sekarang saya telah membaca jawabannya, "case" ejaan mundur tampaknya menjadi standar de facto untuk mengakhiri perintah yang biasanya diterima oleh pengguna yang sudah berpengalaman.
GrnMtnBuckeye
Jika Anda tidak memiliki esacatau sesuatu seperti itu, bagaimana menurut Anda itu akan dapat mengetahui di mana akhir casepernyataan itu?
Barmar
Ini mendefinisikan sebagai bagian dari sintaks dari casepernyataan, dengan cara yang sama bahwa else, elif, dan fididefinisikan sebagai bagian dari sintaks dari suatu ifpernyataan. Itu tidak memiliki semantik sendiri, jadi tidak ada yang bisa dikatakan tentang hal itu, tapi itu pada akhir definisi casepernyataan, jadi di situlah casepernyataan berakhir. Fakta bahwa itu casedieja terbalik adalah rasa ingin tahu yang nyaman, tetapi komputer tidak peduli, ia hanya tahu bahwa ia sedang mencari kata tertentu.
hobbs
1
@ hobbs "... tidak ada yang bisa dikatakan tentang itu ..." namun Anda hanya menulis paragraf penjelasan mengapa tidak ada yang bisa dikatakan tentang itu. Yang penting adalah untuk memahami maksud dari "esac". Itu sebabnya pertanyaan ini memiliki jawaban langsung dengan jumlah upvotes yang cukup.
Angelo

Jawaban:

99

Seperti fiuntuk ifdan doneuntuk for, esacadalah cara yang diperlukan untuk mengakhiri casepernyataan.

esacadalah casedieja mundur, bukan seperti fiyang ifdieja mundur. Saya tidak tahu mengapa token yang mengakhiri forblok tidak rof.

Yakub Minshall
sumber
33
Maksud Anda mengapa tidak odmengakhiri doblok? :)
Wildcard
4
Bayangkan harus mengetik \odsetiap kali Anda ingin menggunakan utilitas itu! Yang jarang, tapi maksud saya;)
Score_Under
2
Menarikmu keluar dari 666. Sama-sama: P. Dan jawaban yang bagus!
TheWanderer
12
@Wildcard Ini fidan tidak neht, jadi dengan analogi akan rof(atau elihw) dan tidak od(juga, tentu saja, odsudah diambil) ... tapi mungkin ini mengharapkan terlalu banyak konsistensi diri dari salah satu bahasa yang paling tidak konsisten diri ada.
zwol
1
ROTFL tidak ada lagi yang ingin dikatakan
gerhard d.
55

Kata esackunci ini memang pembatas yang diperlukan untuk mengakhiri casepernyataan bashdan sebagian besar shell yang digunakan di Unix / Linux tidak termasuk cshkeluarga.

Shell Bourne asli dibuat oleh Steve Bourne yang sebelumnya bekerja di ALGOL68 . Bahasa ini menemukan teknik kata terbalik ini untuk membatasi blok.

case/esac

if/fi

do/od

Yang terakhir tidak lebih do/odtapi do/donedi Bourne dan semua kerang yang berasal termasuk bashkarena odsudah ada sebagai perintah Unix sejak awal ( o ctal d UMP ).

Perhatikan bahwa do/doneblok fungsional diperkenalkan oleh baik for, yang while, atau untilinstruksi. for, whiledan untiltidak perlu diakhiri sebagaimana donememadai. Itulah alasan mengapa tidak perlu untuk hipotetis rofdan elihwtoken.

Jlliagre
sumber
6

" esac" Mengakhiri " " sebelumnya caseuntuk membentuk " blok kode ".

Dalam Algol68 mereka digunakan, umumnya urutan karakter terbalik dari kata kunci pengantar digunakan untuk mengakhiri enklosur, misalnya ( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).

Saya akan memanggil mereka "Blok-blok yang Dilindungi" setelah Edsger Dijkstra dan Bahasa Komando yang dijaga .

odmungkin tidak digunakan di Shell Bourne karena pra-keberadaan perintah "od" Unix .

Sejarah:

Gagasan "Guarded Block" tampaknya berasal dari ALGOL 68 misalnya Bahasa Inggris:

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;

Implementasi LGU Algol68 Soviet melakukan hal yang sama: Dalam bahasa Inggris, pernyataan kasus Algol68 yang penuh hormat berbunyi case ~ in ~ out ~ esac, dalam Cyrillic ini berbunyi выб ~ в ~ либо ~ быв.

Kemudian pada tahun 1975, kode-blok Algol68 dipinjam oleh Edsger Dijkstra untuk Bahasa Perintah yang dijaga . misalnya

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

Agaknya Dijstra digunakan "Dijaga Blok" untuk mengatasi Menggantung lain ambiguitas dilaksanakan di Algol60 dan kemudian kembali direkayasa dalam Pemrograman C Bahasa . (lih. shift-kurangi konflik. )

Akhirnya - dari Algol68 - " esac" berhasil masuk ke cangkang Bourne 1977 (tempat Anda menemukan esac) milik Stephen R. Bourne yang telah mengembangkan kompiler Algol68 awal yang disebut ALGOL 68C .

Stephen yang terkenal juga menggunakan Blok yang dijaga yang sama ini dalam "file header C" yang disebut macro.h

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

Jenius perangkat lunak terkenal Landon Curt Noll dan Larry Bassel menemukan kode makro.h Steve pada tahun 1984 ketika dipekerjakan di kelompok porting Genix National Semiconductor dan berjuang untuk memahami penerapannya. Maka Landon & Larry kemudian menciptakan Kontes Kode C Internasional yang Dikaburkan ...

Dari 1984 hingga hari ini telah ada beberapa ribu bahasa pemrograman "lebih baik" lainnya yang tidak menggunakan Perintah Dijkstra's Guarded. Dan penggunaannya oleh Steven Bourne macro.hsekarang sering dikutip dalam "Disertasi Pengembangan Perangkat Lunak" dari mahasiswa IT sebagai bukti bahwa mereka tidak tidur dalam kuliah. :-)

NevilleDNZ
sumber
Apa case out? tidak pernah melihat sintaks itu
Dani_l
1
@Dani_l Itu sintaks Algol68 tidak diadopsi oleh shell bourne.
jlliagre
Mengapa mereka menyebutnya odbahkan jika belum diambil? Bukankah begitu rofatau tidak elihw?
flarn2006
Memilih do ~ od, if ~ fidan secara case ~ esacsederhana berarti bahwa generasi yang akan datang dari undergrads yang tak ada habisnya akan dapat merenungkan Algol68 dan menambahkan "kritik" sederhana Algol68 ke dalam proyek tahun terakhir mereka, tanpa harus benar-benar menulis lebih dari satu halaman (baris?) Kode Algol68.
NevilleDNZ
1

Ya, itu wajib. Seperti yang ditunjukkan Yakub di atas, logikanya sama dengan if/ fi. Pembatas komentar C tradisional /*dan */pasangan juga sama. Karena C ditulis sehingga Unix dapat ditulis sebagian besar dalam C, dengan kode perakitan minimum, dengan tumpang tindih besar antara tim pengembangan C dan Unix, masuk akal untuk mengasumsikan sumber umum dari anggapan bahwa persamaan penutup multi pembatas blok-karakter harus urutan karakter yang sama dalam urutan terbalik.

Sebaliknya, loop seperti for,, whiledan untilmenggunakan do... donealih-alih membalik urutan karakter, jadi ada beberapa ketidakkonsistenan.

Monty Harder
sumber
3
Sintaks berasal dari Bourne, yang sekali lagi terinspirasi oleh ALGOL.
Runium