나중에 세미콜론이 허용되지 않는 이유는 무엇입니까?

나중에 세미콜론이 허용되지 않는 이유는 무엇입니까?

저는 쉘 프로그래밍을 처음 접했고 다음이 허용되는 것을 확인했습니다.

if [ $table = "Session" ]; then
continue; fi

다음도 마찬가지입니다.

if [ $table = "Session" ]; then continue; fi

다음은 구문 오류를 생성하지만:

if [ $table = "Session" ]; then; continue; fi

then키워드가 다른 키워드와 다른 이유는 무엇입니까 ?

답변1

then명령도 아니고 쉘 내장도 아니지만 실제로는 if구문의 일부 이기 때문입니다 . 에서 man bash:

   if list; then list; [ elif list; then list; ] ... [ else list; ] fi
          The  if  list is executed.  If its exit status is zero, the then
          list is executed.  Otherwise, each  elif  list  is  executed  in
          turn,  and  if  its  exit status is zero, the corresponding then
          list is executed and the command completes.  Otherwise, the else
          list  is executed, if present.  The exit status is the exit sta‐
          tus of the last command executed, or zero if no condition tested
          true.

그래서 이거:

if [ $table = "Session" ]; then continue; fi

이는 및 둘 다 독립적으로 실행될 수 있는 명령이기 [ $table = "Session" ]때문에 작동합니다 . 대화형 셸에 붙여넣기만 하면 구문 오류가 발생하지 않는 것을 확인할 수 있습니다.continuelistif

martin@martin:~$ export table=test
martin@martin:~$ [ $table = "Session" ]
martin@martin:~$ continue
bash: continue: only meaningful in a `for', `while', or `until' loop

반면에 then이는 실제로 단독으로 실행될 수 있는 명령은 아닙니다.

martin@martin:~$ then
bash: syntax error near unexpected token `then'

따라서 처음 두 예에서는 if매뉴얼 페이지에 설명된 대로 사용하고 있습니다.

if list; then list; fi

하지만 그 ;뒤에 하나를 추가 하면 구문 오류로 처리됩니다. 물론 쉘 구문은 때때로 매우 혼란스러워 보일 수 있습니다. 특히 처음 사용하는 경우에는 더욱 그렇습니다. 공간이 필요하고 주변 공간이 필요하다는 사실 때문에 매우 혼란스러웠던 기억이 납니다 . 그러나 이것이 실제로 명령이거나 내장된 쉘이라는 것을 알고 나면 이해가 됩니다. :)thenbash[][

답변2

명령 뒤에 세미콜론을 추가해야 합니다. [ … ]는 그런 명령입니다 continue. 반면에 if, thenfi는 명령이 아니며 예약어입니다.

if명령처럼 보이지만 거의 항상 명령이 따르기 때문입니다. 글쓰기는 유효하다

if print_table_value >foo; [ "$(cat foo)" = "Session" ]; then …

이는 또한 다양한 방식으로 제시될 수 있습니다.

if
  print_table_value >foo
  [ "$(cat foo)" = "Session" ]
then

조건부 명령의 일반적인 구문은 다음과 같습니다.

만약에화합물 목록그 다음에화합물 목록
(엘리프화합물 목록그 다음에화합물 목록) *  
(다른화합물 목록그 다음에화합물 목록) ?
필리핀 제도

어디

  • 줄 바꿈은 단지 가독성을 위한 것입니다.
  • 화합물 목록;개행 또는 개행 문자로 끝나는 명령 목록입니다 .
  • (…) ? 선택적인 부분을 나타내며, (…) *는 0, 1, 여러 번 반복될 수 있는 부분을 나타냅니다.

키워드는 명령 시작 부분에서만 인식됩니다.

조건부 명령은 키워드로 끝나야 합니다 fi. 이는 연산자가 다른 명령이 따라오는 경우 이를 따라야 할 필요성을 제거하지 않습니다. 예를 들어 조건문 뒤에 다른 명령이 오는 경우 조건문 ;사이에 또는 개행 문자가 있어야 합니다. 이 백그라운드에서 실행되면 wait wait 가 뒤따라야 합니다 &.

관련 정보