bash 사례 설명 끝에 있는 "esac"은 무엇을 의미합니까? 그게 필요 할까?

bash 사례 설명 끝에 있는 "esac"은 무엇을 의미합니까? 그게 필요 할까?

Bash 사례 설명 끝에 나타나는 "esac"의 여러 예를 찾았지만 그 사용에 대한 명확한 문서는 찾지 못했습니다. 매뉴얼 페이지에서는 이를 사용하며 심지어 단어에 대한 색인(https://www.gnu.org/software/bash/manual/bashref.html#index-esac), 그러나 그 목적을 정의하지는 않습니다. 이것이 사례 설명을 끝내는 바람직한 방법입니까, 모범 사례입니까, 아니면 순전히 기술적입니까?

답변1

fifor ifdonefor와 for마찬가지로 esac명령문을 끝내는 데 적합한 방법입니다 case.

esac철자법 이 거꾸로 case인 것처럼 거꾸로 철자합니다 . 블록을 끝내는 토큰이 왜 아닌지 모르겠습니다 .fiifforrof

답변2

esac키워드는 실제로 명령문을 끝내는 데 필요한 구분 기호이며 Unix/Linux(이 계열 제외)에서 사용되는 대부분의 셸에 있습니다 case.bashcsh

원래의본 쉘창조자:스티브 번전에 일했던 사람알고리즘 68. 이 언어는 청크를 분리하기 위해 역 단어 기술을 발명했습니다.

case/esac

if/fi

do/od

후자는 더 이상 존재하지 않지만 do/odBourne do/done및 모든 파생 쉘에서 Unix 명령으로 처음 bash부터 존재했습니다(od케타르너프).

기능 블록 은 or 지시문 do/done에 의해 도입됩니다 . 종료할 필요가 없으면 충분 합니다 . 이것이 가정과 레이블이 필요하지 않은 이유 입니다 . forwhileuntilforwhileuntildonerofelihw

답변3

" esac" 더 일찍 종료하여 " case"을(를) 구성합니다.코드 블록".

Algol68에서 이를 사용하려면 일반적으로 키워드를 소개하는 문자의 역순을 사용하여 캡슐화를 종료합니다.( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).

이후에는 "보호된 블록"이라고 부르겠습니다.에즈거 데이크스트라그리고 그의보호된 명령 언어.

od아마도 기존 Unix로 인해 Bourne Shell에서는 사용되지 않았을 것입니다."od" 명령.

역사:

"Guarded Block"에 대한 아이디어는 다음에서 나온 것 같습니다. 앨 고어 68예를 들어 영어:

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

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

옛 소련Algol68 LGU 구현또한 같은 일을 합니다. 영어로 Algol68의 경건한 사례 진술은 다음과 같습니다. case ~ in ~ out ~ esac키릴 문자로는 다음과 같습니다 выб ~ в ~ либо ~ быв.

그러다가 1975년에 Algol68의 코드 블록을 빌려왔습니다.에즈거 데이크스트라그를 위해보호된 명령 언어. 예를 들어

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

아마도 Dijstra는 이를 극복하기 위해 "가드 블록"을 사용했을 것입니다.다른 것에 매달려모호성은 다음과 같이 구현됩니다.알골60그런 다음 다시 디자인C 언어. (보다전환 - 갈등을 줄입니다.)

마지막으로 - Algol68에서 - " esac"가 1977년에 입력되었습니다.본 쉘(당신이 찾은 곳 esac) 공손함스티븐 R. 번그는 다음과 같은 초기 Algol68 컴파일러를 개발했습니다.앨 고어 68C.

Stephen은 또한 다음과 같은 "C 헤더 파일"에서 이와 동일한 보호 블록을 사용한 것으로 알려져 있습니다.매크로

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

유명한 소프트웨어 천재랜든 코터 놀그리고래리 바델1984년 National Semiconductor의 Genix 포팅 팀에서 일하던 중 그는 우연히 Steve의 Macro.h 코드를 발견하고 그 응용 프로그램을 이해하는 데 어려움을 겪었습니다. 그래서 랭던과 래리는 이렇게 창조했습니다.국제 난독화 C 코드 대회...

1984년부터 현재까지,수천Dijkstra의 보호된 명령을 사용하지 않는 다른 "더 나은" 프로그래밍 언어입니다. Steven Bourne의 이러한 사용은 macro.h이제 IT 학부생들이 강의 중에 잠을 자지 않았다는 증거로 "소프트웨어 개발 에세이"에서 자주 인용됩니다. :-)

답변4

예, 필수입니다. Jacob이 위에서 지적했듯이 논리는 if/ 와 동일 합니다 fi. 전통적인 C 주석 구분 기호 /**/유사하게 쌍을 이룹니다. C는 최소한의 어셈블리 코드를 사용하여 Unix를 대부분 C로 작성할 수 있도록 작성되었으며 C와 Unix 개발 팀 사이에 상당한 중복이 있기 때문에 개념의 공통 기원, 많은 동등 항목의 끝을 가정하는 것이 합리적입니다. 문자 블록 구분 기호는 동일한 문자 순서의 역순이어야 합니다.

대신 , , 및 use ... 와 같은 루프를 for사용 while합니다. until문자 do순서 done를 바꾸는 대신 다음과 같이 합니다.일부일관성 없는.

관련 정보