
私はシェル構文に関する@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)では、単語は発話によって記述されるトークンの一部です。単語拡張後、単語の概念は適用されなくなり、フィールドだけが残ります。
ご覧のとおり、「単語」と「トークン」の間には違いがあり、質問に示されているように同義ではありません。さらに、標準では、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
はい、非常に具体的な質問の表現は時々混乱する可能性があります。