나는 쉘 구문에 대한 @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)에서 단어는 발화로 설명되는 토큰의 일부입니다. 단어 확장 후에는 단어 개념이 더 이상 적용되지 않고 필드만 남습니다.
보시다시피 "단어"와 "토큰" 사이에는 차이가 있으며 질문에 암시된 것처럼 동의어가 아닙니다. 또한 표준에서는 두 개의 세미콜론을 별도의 문자로 간주하지 않고 하나의 세미콜론으로 간주합니다.단일 단위.
답변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
예, 매우 구체적인 질문의 표현은 때때로 혼란스러울 수 있습니다.