bash 사례 선언의 끝에서 "esac"는 무엇을 의미합니까? 필요합니까?


55

bash case 문 끝에 "esac"에 대한 여러 가지 예를 찾았지만 사용법에 대한 명확한 문서를 찾지 못했습니다. 매뉴얼 페이지는 그것을 사용하며 단어 ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ) 에 대한 색인을 가지고 있지만 사용을 정의하지는 않습니다. 사례 진술, 모범 사례 또는 순수한 기술을 끝내는 데 필요한 방법입니까?


2
esac정확히 어디에 있어야 하는지를 나타내는 인덱스 엔트리 – 정의하고 필요한 것을 나타내는 선.
hobbs

@hobbs, 당신은 인덱스가 그 사용을 나타내는 줄을 가리키는 것이 맞지만, 특히 "|"와 같은 다른 문자의 사용을 설명하는 방식과 비교하여 어떤 식으로도 정의하지 않습니다. 또는 ";" 또는 ";;". 답을 읽었으므로, 역진 철자 "case"는 대부분의 숙련 된 사용자가 당연한 것으로 생각하는 명령을 끝내는 사실상의 표준으로 보입니다.
GrnMtnBuckeye

가지고 있지 않거나 esac이와 비슷한 것이 있다면, case성명서 의 끝이 어디에 있는지 어떻게 알 수 있을까요?
Barmar

이는 구문의 일부로서 정의를 case동일하게하여, 문 else, eliffi의 신택스의 일부로서 정의 if문. 자체 의미가 없기 때문에 그것에 대해 할 말이 없지만 case명령문 정의가 case끝났 으므로 명령문이 끝나는 곳입니다. case철자가 철회 된다는 사실 은 편리한 호기심이지만 컴퓨터는 신경 쓰지 않고 특정 단어를 찾고 있다는 것을 알고 있습니다.
hobbs

1
@hobbs "... 아무것도 할 말이 없습니다 ..."그러나 당신은 그것에 대해 아무 말도하지 않는 이유를 설명하는 단락을 썼습니다. 중요한 것은 "esac"의 의도를 이해하는 것입니다. 그렇기 때문에이 질문에 많은 공감 수가있는 정답이 있습니다.
Angelo

답변:


99

마찬가지로 fi에 대한 ifdone대한 for, esac종료하는 데 필요한 방법입니다 case문을.

esaccase철자 가 철자가 아닌 철자 fiif철자가됩니다. for블록을 끝내는 토큰이 아닌 이유를 모르겠습니다 rof.


33
왜 블록 od을 끝내지 do않습니까? :)
와일드 카드

4
\od해당 유틸리티를 사용할 때마다 입력해야한다고 상상해보십시오 ! 드문 일이지만 내 요점은;)
Score_Under

2
당신을 환영합니다 : P. 그리고 좋은 대답입니다!
TheWanderer

12
@Wildcard 그것은 fi아닙니다 neht. 따라서 비유하면 rof(또는 elihw) 아닌 것입니다 od(물론 od이미 사용되었습니다) ...하지만 아마도 이것은 가장 일관되지 않은 언어 중 하나에서 너무 많은 자기 일관성을 기대하고 있습니다. 있습니다.
zwol

1
ROTFL은 말할 것도 없습니다
gerhard d.

55

esac키워드는 참으로 종료 필수 구분 기호 case에 문 bash제외 유닉스 / 리눅스에서 사용되는 대부분의 쉘 csh가족.

원래 Bourne 쉘 은 이전에 ALGOL68에서 작업했던 Steve Bourne에 의해 작성되었습니다 . 이 언어는 블록을 구분하기 위해이 반전 된 단어 기법을 발명했습니다.

case/esac

if/fi

do/od

후자가 더 이상 없을 do/od뿐만 do/doneBourne의에 포함 된 모든 유도 포탄 bash때문에 od이미 설립 (보낸 유닉스 명령으로서 존재 하였다 O ctal D UMP ).

참고 do/done기능 블록 중 하나에 의해 소개 forwhile, 또는 until지시. for, while그리고 until으로 종료 할 필요가 없습니다 done충분하다. 그것이 가설 rofelihw토큰이 필요없는 이유 입니다.


6

" esac" case은 " code-block " 을 형성하기 위해 이전 " "을 종료합니다 .

Algol68에서는 일반적으로 도입 키워드의 반전 문자 순서가 엔클로저를 종료하는 데 사용됩니다 (예 : ( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).

Edsger Dijkstra 와 그의 Guarded Command Language의 이름을 따서 "Guarded Blocks"라고 부릅니다 .

od아마도 유닉스 "od"명령 이 이미 존재했기 때문에 Bourne Shell에서 사용되지 않았을 것 입니다.

역사 :

"Guarded Block"아이디어는 ALGOL 68 에서 나온 것 같습니다. 예 : 영어 :

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;

소비에트의 Algol68 LGU 구현 도 동일하게 수행되었습니다. 영어에서 Algol68의 경건한 사례 case ~ in ~ out ~ esac는 다음과 같습니다 выб ~ в ~ либо ~ быв.

그리고 1975 년 Algol68의 코드 블록에 의해 차용 Edsger 데이 크 스트라 자신을 위해 지키고 명령 언어 . 예 :

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

아마도 Dijstra는 "Guarded Blocks"를 사용 하여 Algol60 에서 구현 된 Dangling else 모호성 을 극복 한 다음 C 프로그래밍 언어 로 다시 엔지니어링했습니다 . (cf. 교대 감소 갈등 )

마지막으로 Algol68에서 " esac"는 ALGOL 68C 라는 초기 Algol68 컴파일러를 개발 한 Stephen R. Bourne 의 1977 Bourne 쉘 (당신이 발견 한 곳 esac)에 들어갔다 .

유명한 Stephen도 이와 같은 Guarded Blocks를 macro.h 라는 "C 헤더 파일"에 사용 했습니다.

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

주목할만한 소프트웨어 천재 인 Landon Curt NollLarry Bassel 은 1984 년 Steve의 macro.h 코드를 우연히 발견 한 후 내셔널 세미 컨덕터의 Genix 포팅 그룹에서 일하면서 애플리케이션 이해에 어려움을 겪었습니다. 그래서 Landon & Larry는 International Obfuscated C Code Contest 를 만들었습니다 .

1984 년부터 현재까지 Dijkstra의 Guarded Commands를 사용하지 않는 수천 개의 "더 나은"프로그래밍 언어가 있습니다. 그리고 스티븐 본 (Steven Bourne)의 사용 macro.h은 이제 IT 학부생들의 "소프트웨어 개발 논문 (Software Development Dissertations)"에서 종종 강의에서 잠들지 않았다는 증거로 인용됩니다. :-)


무엇입니까 case out? 그 구문을 본 적이 없다
Dani_l

1
@Dani_l 본 쉘에서 채택하지 않은 Algol68 구문입니다.
jlliagre

od아직 가져 오지 않았는데 왜 전화를 걸까요? 가되지 않을까 rofelihw?
flarn2006

따기 do ~ od, if ~ fi그리고 case ~ esac단순히 학부생의 끝없는 미래 세대가 Algol68을 숙고하고 실제로 페이지 (라인?) Algol68 코드의 다음 이상을 작성하지 않고도, 자신의 마지막 학기 프로젝트로 Algol68의 간단한 "비판"을 추가 할 수 있다는 것을 의미한다.
NevilleDNZ

1

예, 필수입니다. 야곱이 위에서 지적한 것처럼, 그 논리는 if/ 와 같습니다 fi. 전통적인 C 주석 구분 기호 /**/유사하게 쌍을 이룹니다. C는 Unix가 대부분 C로 작성 될 수 있도록 작성되었으므로 최소한의 어셈블리 코드를 사용하여 C와 Unix 개발 팀간에 겹치는 부분이 많으므로 멀티의 닫는 것과 동등한 개념의 공통 소스를 가정하는 것이 합리적입니다. 문자 블록 분리 문자는 역순으로 동일한 문자 시퀀스 여야합니다.

반면, 같은 루프 for, whileuntil사용을 do... done대신 문자 순서를 반대로의, 그래서이 일부 불일치.


3
구문은 ALGOL에서 영감을 얻은 Bourne에서 나왔습니다.
Runium
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.