引用符のないメタ文字はどのようにマークアップの一部になりますか?

引用符のないメタ文字はどのようにマークアップの一部になりますか?

私はシェル構文に関する@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>

しかし、これは私が得られない円です。

  • ;「メタ文字」です。
  • 「メタ文字」は、引用しない場合は「単語」を区別します。
  • 「トークン」は、「単語」を意味するために使用できる別の用語です。
  • ;;トークンです。
  • だから;;言葉です。

ただし、これは 2 つの単語区切り文字で構成される単語であることを意味します。参照されず、識別するために周囲にスペースが必要ないことを考慮すると、これはどのように可能ですか?


気になりましたか?私が読んでいるシェル構文に関する他の質問は次のとおりです。

答え1

BashはPOSIXと同じ用語を使用します(驚くべきことではありません)。比較(時々説明)のために使用してください。

から引用定義

3.113 制御演算子

シェルコマンド言語で制御機能を実行するタグ。次の記号のいずれかです。

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

シェルで内部的に使用される入力エンドインジケータも制御演算子と見なされます。

注:トークン認識はXCUで詳細に定義されています。トークン認識

3.407 トークン

シェルコマンド言語でシェルが考慮する文字の順序シングルユニット入力を読むとき。トークンは演算子または単語です。

注:入力読み取り規則はXCUで詳細に定義されています。トークン認識

3.440 言葉

シェルコマンド言語の演算子ではないトークンです。場合によっては、単語は単語トークンの一部でもあります。さまざまな種類のパラメータ拡張(例:$ {name-word})と変数の割り当て(例:name = word)では、単語は発話によって記述されるトークンの一部です。単語拡張後、単語の概念は適用されなくなり、フィールドだけが残ります。

注:詳細についてはXCUを参照してください。パラメータ拡張そして単語表現

ご覧のとおり、「単語」と「トークン」の間には違いがあり、質問に示されているように同義ではありません。さらに、標準では、2つのセミコロンを別々の文字とは見なすことなく、1つのセミコロンと見なします。シングルユニット

答え2

bash語彙アナライザによって生成されたトークンを解析します。行を単語に分割するときにbash文字を使用する可能性が高いです。コマンドの構文を解析するときにトークンを使用します。この場合、;;2つの「;」文字ではなく、2 つの「;」で構成されるトークンです。 (セミコロン)文字。 bashの語彙アナライザは、文字グループをトークンとして認識できるように着信文字ストリームを読み込みます。したがって、コードには実際にはセミコロンは表示されず、トークンコードが表示されます。

これについては、flexおよびツールを参照してください。bison私はBashがこれを使用しているとは信じていませんが、構文解析に似たアプリケーション用のツールであり、解析が一般的に行われる方法の概要があります。

これGNU Bashリファレンスマニュアル読んでみる良いドキュメントです。よく書かれていますが、マニュアルページよりも多くの説明があります。

答え3

はい、;;それは言葉です。しかし、2つのメタ文字が一緒にあるわけではありません。
これがケースの説明の終わりです。

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

または1行:

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

はい、「is」とスペースで区切られているので、1単語です。
しかし、必ずしもそうする必要はありません。

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

はい、非常に具体的な質問の表現は時々混乱する可能性があります。

関連情報