세미콜론이 프로그램을 분리하는 데 사용된다는 것을 읽었습니다.
$ echo 3; ls -la
그것은 그 뜻 if, then그리고 else별도의 프로그램이 여기에?
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
이 질문은 세미콜론에 관한 것이 아닙니다.
[ $variable == abcdef ] && echo yes || echo no
세미콜론이 프로그램을 분리하는 데 사용된다는 것을 읽었습니다.
$ echo 3; ls -la
그것은 그 뜻 if, then그리고 else별도의 프로그램이 여기에?
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
이 질문은 세미콜론에 관한 것이 아닙니다.
[ $variable == abcdef ] && echo yes || echo no
답변:
;분리형 문 (느슨하게 말하기). ;개행 문자 로 대체하는 것은 (거의) 항상 가능합니다 .
말을 ;분리형에게 그러므로 두 개의 프로그램을, if그리고 then"프로그램"성명은 예약어, 쉘 함수로 만들어 질 수있다으로 조금 너무 단순하다,해야 내장 등 유틸리티와 외부 유틸리티, 이러한 사용하여 파이프의 조합 부울 연산자 등
양자 모두 if 와 then단어 예약되어 쉘 문법 이 아니라 "프로그램". 여기서는 기술적으로 복합 명령 을 구축하는 데 사용됩니다 .
echo 쉘에 내장 유틸리티 일 가능성이 높지만 (필요하지는 않지만) ls 외부 유틸리티 (또는 "프로그램") 일 수도 있습니다.
쉘 사용의 기본을 배우기 시작했을 때의 첫 번째 근사치이지만 "여기서는 프로그램을 실행하는 방법"과 "한 줄에 여러 프로그램을 하나씩 실행하는 방법"수준이 있습니다. 실제로 사실이 아닙니다.
초보자를 이해하기는 어렵지만보다 정확한 설명은 쉘 언어가 컴퓨터 언어라는 것 입니다. 그것은이 구문을 . 이 구문은 개행, 연산자, 단어 및 예약어를 포함하여 다양한 어휘 요소로 구성 됩니다.
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 준수'쉘은을 준수 해야하는하는 구문을 설명합니다.
실제로 생각하는 무리한하지 않습니다 if, then그리고 else외부 프로그램으로. 사실, 톰슨 쉘은 원래 1 판에 유닉스 구현 if과 goto외부 프로그램으로. 이것은 서브 프로세스가 쉘 프로세스와 파일 디스크립터를 공유하기 때문에 가능하기 때문에 (앞으로) goto는 대상 레이블을 찾은 다음 종료 할 때까지 입력을 읽어야했습니다. Thompson shell을 참조하십시오 .
then및 else프로그램이 아니다. 다른 부분은 있습니다. 공지 사항은 더 없어 ;직접 후 '하지만 명령 다음에 그들은 앞에.
은 [ ... ] 이다 명령하고, 필요 ;다른 명령의 시작 다음 경우.
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'것은 명령입니다.
전체 제어 구조는 명령이지만 여전히 프로그램이 아닙니다.
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? 마지막 하나?
program3 baz. 명령 목록의 종료 상태는 해당 목록에서 마지막 명령의 종료 상태입니다. 다른 두 개는 조건에 영향을주지 않고 실패 할 수 있습니다.