`if`와`then`은 실제로 프로그램입니까?


15

세미콜론이 프로그램을 분리하는 데 사용된다는 것을 읽었습니다.

$ echo 3; ls -la

그것은 그 뜻 if, then그리고 else별도의 프로그램이 여기에?

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

이 질문은 세미콜론에 관한 것이 아닙니다.



1
@StephenRauch 실제로 중복되지는 않습니다. 더 이해하기위한 시도로서, 그 Q로부터 합리적으로 파생 된 것입니다.
user207673

더 많은 프로그램 형식 :[ $variable == abcdef ] && echo yes || echo no
Hagen von Eitzen

2
@HagenvonEitzen은 엄격하지 않습니다. 첫 번째 분기 내의 문이 실패하면 두 번째 분기도 실행됩니다.
Morgen

답변:


26

;분리형 문 (느슨하게 말하기). ;개행 문자 로 대체하는 것은 (거의) 항상 가능합니다 .

말을 ;분리형에게 그러므로 두 개의 프로그램을, if그리고 then"프로그램"성명은 예약어, 쉘 함수로 만들어 질 수있다으로 조금 너무 단순하다,해야 내장 등 유틸리티와 외부 유틸리티, 이러한 사용하여 파이프의 조합 부울 연산자 등

양자 모두 ifthen단어 예약되어 쉘 문법 이 아니라 "프로그램". 여기서는 기술적으로 복합 명령 을 구축하는 데 사용됩니다 .

echo 쉘에 내장 유틸리티 일 가능성이 높지만 (필요하지는 않지만) ls 외부 유틸리티 (또는 "프로그램") 일 수도 있습니다.


7

쉘 사용의 기본을 배우기 시작했을 때의 첫 번째 근사치이지만 "여기서는 프로그램을 실행하는 방법"과 "한 줄에 여러 프로그램을 하나씩 실행하는 방법"수준이 있습니다. 실제로 사실이 아닙니다.

초보자를 이해하기는 어렵지만보다 정확한 설명은 쉘 언어가 컴퓨터 언어라는 것 입니다. 그것은이 구문을 . 이 구문은 개행, 연산자, 단어 및 예약어를 포함하여 다양한 어휘 요소로 구성 됩니다.

if, then, else, 그리고 fi모두 예약 된 단어 . 문법 에 따라 쉘에 제공하는 입력을 구문 분석 할 때 특별한 의미가 있습니다. 비슷하게,; 구분자 연산자 입니다.

쉘 언어로 된 입력은 다른 프로그램 인 인터프리터 , 쉘에 의해 해석 되는 컴퓨터 프로그램 전체로 간주됩니다 . 개별 문법 부분은 프로그램이 아닙니다. 쉘 언어는 쉘이 실행할 다른 프로그램을 지정하는 방법입니다.

[쉘 문법에서 연산자와 같은 특수한 어휘 요소가 아닙니다. 그것은 하나의 그러한 프로그램을 명명 하는 일반적인 단어[ 입니다. 많은 포탄이 (가)이 내장 된 쉘 프로그램 자체의 코드에 결합 된이 프로그램의 버전,하지만 당신은 또한 찾을 수 있습니다 외부 곳 등이 이름의 프로그램을 /bin/[또는 /usr/bin/[어떤 프로그램 보다 다른 쉘 호출 할 수 있습니다. 마찬가지로 ]특별한 쉘 어휘 요소도 아닙니다. 그것은 일반적인 단어입니다.[프로그램 입니다. [프로그램은 최종 인수가,이 실행될 때, 수 있어야 ]그 다음 무시할 진행한다.

귀하의 질문에 명명 된 또 다른 유사한 프로그램은 echo입니다. 또한 대부분의 쉘에는이 프로그램의 내장 버전이 있습니다. 그러나 다시 어딘가 등, 또한 프로그램의 외부 버전이 /bin/echo/usr/bin/echo, 프로그램을 다른 것보다 껍질이 호출 할 수 있습니다.

귀하의 질문에 명명 된 세 번째 프로그램은 ls입니다. 쉘은 일반적으로이 프로그램의 내장 버전을 가지고 있지 않으며, /bin/ls또는 같은 곳에서 찾을 수있는 외부 프로그램 /usr/bin/ls입니다.

Bourne Again 쉘 의 경우 GNU Bourne Again 쉘 정보 문서 의 기본 쉘 기능 에서 이에 대한 자세한 내용을 읽을 수 있습니다 . 다른 껍질에는 자연스럽게 다른 문법이 있습니다. 그만큼단일 유닉스 규격은 (자신의 POSIX 준수 '모드에서) 모든 POSIX 준수'쉘은을 준수 해야하는하는 구문을 설명합니다.

추가 자료

  • " 쉘 문법 ". 쉘 명령 언어 . 기본 사양 문제 7. 공개 그룹. IEEE 1003.1-2008. ISBN 1937218812.
  • test. 유틸리티 . 기본 사양 문제 7. 공개 그룹. IEEE 1003.1-2008. ISBN 1937218812.
  • " 쉘 문법 ". Z 쉘 매뉴얼 . 버전 5.3.1. 2017.

5

실제로 생각하는 무리한하지 않습니다 if, then그리고 else외부 프로그램으로. 사실, 톰슨 쉘은 원래 1 판에 유닉스 구현 ifgoto외부 프로그램으로. 이것은 서브 프로세스가 쉘 프로세스와 파일 디스크립터를 공유하기 때문에 가능하기 때문에 (앞으로) goto는 대상 레이블을 찾은 다음 종료 할 때까지 입력을 읽어야했습니다. Thompson shell을 참조하십시오 .


또는 실제로 로랑 Bercot의 참조 ififelse일부있는, execline. 그러나 이것들은 if문제가 아닙니다.
JdeBP

2
"실제로 외부 프로그램으로 생각할 수있는 것은 아닙니다. "그렇지 않기 때문입니다.
Monica와의 가벼움 경주

2

thenelse프로그램이 아니다. 다른 부분은 있습니다. 공지 사항은 더 없어 ;직접 후 '하지만 명령 다음에 그들은 앞에.

[ ... ] 이다 명령하고, 필요 ;다른 명령의 시작 다음 경우.

Bash의 모든 제어 구조 및 아마도 대부분의 * nix 셸인 AFAIK 는 동일합니다. 통역사에게 지시합니다. 반면에 테스트 또는 조건은 "실행"되고 명령 인 프로그램 / 프로세스를 사용합니다. 명령으로 then이어지는 행의 일부 이므로 echo이전 명령과 줄 바꿈으로 구분해야합니다 [ ... ]. 제어하는 명령과 분리 할 필요는 없습니다 echo yes.

합법적으로 읽기는 어렵지만 읽기가 어렵습니다.

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

;비록 그들 자신의 라인에 있지 않더라도, 컨트롤들 사이에 전혀 필요 가 없습니다.

흥미롭게도 전체 제어 구조 ( if ... fi)는 쉘 명령이며, 전체는 개행 또는 a로 끝나야합니다 ;. 마지막 줄은이어야 fi echo done하지만이어야합니다 fi; echo done. 과제와 같은 VARIABLE='abcdef'것은 명령입니다.

전체 제어 구조는 명령이지만 여전히 프로그램이 아닙니다.


1

if, elif, then및은 fi작 제물 중 하나를 구현하기 위해 사용 된 모든 예약어 셸 그 이름 중 어느 하나로 (또는 오히려, 다른 명령) 명령이 없을 수 있음을 의미 껍질 복합 명령으로 언급된다. ;일반적으로 목적은 명령을 분리하는 것이 아니라 명령 목록 을 종료하는 것 입니다. 예를 들어, 다음은 유효한 if진술입니다.

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

if명령문 의 조건은 명령 목록 echo foo; echo bar; echo baz입니다. 구문 분석기는 then세미콜론 바로 뒤에 오는이 (가) 예약 키워드이므로 명령이 될 수 없기 때문에 조건이 끝났음을 알고 있습니다. 따라서 신체의 시작은 다음과 같습니다 then . 마찬가지로 fi예약 된 키워드이므로 if명령문 본문에서 세 번째 명령이 될 수 없지만 복합 명령의 끝을 표시합니다.


고마워, 이것이 사용 if program1 foo; program2 bar; program3 baz; 되면 어떤 프로그램 상태가되어야 합니까? 0그래서 쉘은 then? 마지막 하나?
Maxim Koretskyi

그냥 program3 baz. 명령 목록의 종료 상태는 해당 목록에서 마지막 명령의 종료 상태입니다. 다른 두 개는 조건에 영향을주지 않고 실패 할 수 있습니다.
chepner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.