따옴표가 없는 메타문자는 어떻게 마크업의 일부가 되나요?

따옴표가 없는 메타문자는 어떻게 마크업의 일부가 되나요?

나는 쉘 구문에 대한 @Tim의 질문 중 일부를 읽은 후 매뉴얼 페이지를 살펴보고 있었고 bash(간단한) 내 자신의 질문을 했습니다.

아래는 발췌한 내용입니다 man bash(직접 확인해보세요 LESS=+/^DEFINITIONS man bash:

   word   A  sequence  of  characters  considered  as a single unit by the
          shell.  Also known as a token.
   ...
   metacharacter
          A character that, when unquoted, separates words.   One  of  the
          following:
          |  & ; ( ) < > space tab
   control operator
          A token that performs a control function.  It is one of the fol-
          lowing symbols:
          || & && ; ;; ( ) | <newline>

그러나 이것은 내가 얻지 못하는 원입니다.

  • ;"메타 문자"입니다.
  • "메타 문자"는 인용되지 않은 경우 "단어"를 구분합니다.
  • "토큰"은 "단어"를 의미하는 데 사용할 수 있는 또 다른 용어입니다.
  • ;;토큰입니다.
  • 그러므로 ;;말입니다.

그러나 이는 두 개의 단어 구분 기호로 구성된 단어임을 의미합니다. 참조되지 않고 식별하기 위해 주위에 공백이 필요하지 않다는 점을 고려하면 이것이 어떻게 가능합니까?


궁금하신가요? 제가 읽고 있는 쉘 구문에 대한 다른 질문은 다음과 같습니다.

답변1

Bash는 POSIX와 동일한 용어를 사용합니다(놀랍지도 않습니다). 비교(때때로 설명)를 위해 사용하세요.

에서 인용정의

3.113 제어 연산자

쉘 명령 언어에서 제어 기능을 실행하는 태그. 다음 기호 중 하나입니다.

&   &&   (   )   ;   ;;   newline   |   ||

쉘에서 내부적으로 사용되는 입력 끝 표시기도 제어 연산자로 간주됩니다.

참고: 토큰 인식은 XCU에 자세히 정의되어 있습니다.토큰 인식.

3.407 토큰

쉘 명령 언어에서 쉘이 고려하는 문자 순서단일 단위입력을 읽을 때. 토큰은 연산자 또는 단어일 수 있습니다.

참고: 입력 읽기 규칙은 XCU에 자세히 정의되어 있습니다.토큰 인식.

3.440 단어

쉘 명령 언어에서 연산자가 아닌 토큰입니다. 경우에 따라 단어는 단어 토큰의 일부이기도 합니다. 다양한 형태의 매개변수 확장(예: ${name-word}) 및 변수 할당(예: name=word)에서 단어는 발화로 설명되는 토큰의 일부입니다. 단어 확장 후에는 단어 개념이 더 이상 적용되지 않고 필드만 남습니다.

참고: 자세한 내용은 XCU를 참조하세요.매개변수 확장그리고단어 표현.

보시다시피 "단어"와 "토큰" 사이에는 차이가 있으며 질문에 암시된 것처럼 동의어가 아닙니다. 또한 표준에서는 두 개의 세미콜론을 별도의 문자로 간주하지 않고 하나의 세미콜론으로 간주합니다.단일 단위.

답변2

bash어휘 분석기에 의해 생성된 토큰을 구문 분석합니다. 줄을 단어로 나눌 때 bash문자를 사용할 가능성이 높습니다. 명령 구문을 구문 분석할 때 토큰을 사용합니다. 이 경우에는 ;;두 개의 ";" 문자가 아니라 두 개의 ";"로 구성된 토큰입니다. (세미콜론) 문자. bash의 어휘 분석기는 문자 그룹을 토큰으로 인식할 수 있는 방식으로 들어오는 문자 스트림을 읽습니다. 따라서 코드에는 실제로 세미콜론이 표시되지 않고 토큰 코드가 표시됩니다.

이에 대해 알아보려면 flex및 도구를 참조하세요 . bison나는 Bash가 이것을 사용한다고 믿지 않지만 구문 분석과 유사한 응용 프로그램을 위한 도구이며 구문 분석이 일반적으로 수행되는 방법에 대한 개요 자료가 있습니다.

이것GNU Bash 참조 매뉴얼읽어볼만한 좋은 문서입니다. 잘 작성되었지만 매뉴얼 페이지보다 더 설명이 많습니다.

답변3

예, ;;그것은 단어입니다. 하지만 두 개의 메타문자가 함께 있는 것은 아닙니다.
이것이 사례 설명의 끝입니다.

case a in 
    [a-z]) echo "yes" ;;
esac

또는 한 줄:

case a in [a-z]) echo "yes" ;; esac

예, "is"와 공백으로 구분되어 있으므로 한 단어입니다.
하지만 반드시 이렇게 될 필요는 없습니다.

case a in [a-z]) echo "yes";; esac

예, 매우 구체적인 질문의 표현은 때때로 혼란스러울 수 있습니다.

관련 정보