で言及された主張を作成する方法はありますか?手動コマンド概要説明(「イタリック体のテキストは適切な引数に置き換えられます」と引用)にメタ文字をエスケープせずに含めますか? Tom Ryderが述べた議論の定義によると、Bashクイックスタートガイド(ISBN 978-1-78953-408-5、21ページ)、メタ文字は引数を区別します(少なくとも空白の場合)、bashスクリプトでは、例えばIのように左右の角かっこが使用されていることがわかります。言ったように、彼らは買収の一部です。 。たとえば、次のスクリプトは次のようになりますNUMBER='^[0-9]+$'
。
ベストアンサー1
私の考えでは、「メタ文字」はやや曖昧な用語です。
Bashのマニュアルページは厳密な意味を提供します。
メタ文字:引用符で囲まれていない単語を区切るために使用される文字。次のいずれか:
| & ; ( ) < >
スペースタブの改行」
したがって、シェルで実行されたコマンドに渡された引数を意味する場合、定義に基づいて答えはむしろ「いいえ」です。
一方、他の特殊文字にも使用される場合があります。グローバル文字(たとえば[]*?
)などの{}!#$
特定の項目が含まれている場合、答えはおそらく「時々」です。
特に、POSIXに似たシェルでは、デフォルトでglobパターンと一致するファイルがない場合、ls blahblah?*[123].txt
呼び出しは引数で行われますls
。blahblah?*[123].txt
(存在する場合はその名前が拡張されます。zshとcshは、特に要求しない限り不平を言います。)そして、whileを{
サポートするシェルで中括弧の拡張を開始します。単語の残りの部分も中括弧構文に準拠している場合にのみ、特殊な拡張のみが可能です。 。ls {
単一のパラメータのみが渡されますが、{
2つのパラメータがls foo{a,b}
渡されますfooa
。foob
そして、$
それ以降に何が起こるかに応じて、いくつかの拡張が実行されたり、実行されたりしない場合があります。echo foo$
印刷がfoo$
エラーecho foo<
が発生します。
ここで重要なのは、これが|&;()<>
シェルの語彙アナライザに特別であるため、コマンドライン処理の最初に認識され、コマンド*?[]$
ラインが最初に単語に分割された後にのみ認識されることです。!
そして、#
いくつかは(記録拡張と説明が有効になっている場合)より早く認識されるため、より特別です。しかし、これは語彙分析ステップに影響を与えないため、同じ意味のメタ文字ではありません。echo foo! foo#
印刷foo! foo#
。
それ[[
? blah blah blahのように奇妙に見えるキーワードだけですif
。while
または{
。 (try type if
、、、type {
。type [[
)内部解析に影響を与えるキーワードですが、メタ文字で構成されていないまま出力さecho [[
れます[[
。と比較してみてください。((
どこにecho ((
エラーがありますか? (type ((
うまくいかず、type "(("
役に立つものを提供していません)
しかし、シェルの構文に深すぎるのが役に立つかどうかはわかりません。複雑でやや奇妙な味があります。また、上記の用語やその他の内容で間違いを犯した可能性があります。