세미콜론이 프로그램을 분리하는 데 사용된다는 것을 읽었습니다.
$ 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
. 명령 목록의 종료 상태는 해당 목록에서 마지막 명령의 종료 상태입니다. 다른 두 개는 조건에 영향을주지 않고 실패 할 수 있습니다.