パラメータにメタ文字を含めることはできますか?

パラメータにメタ文字を含めることはできますか?

で言及された主張を作成する方法はありますか?手動コマンド概要説明(「イタリック体のテキストは適切な引数に置き換えられます」と引用)にメタ文字をエスケープせずに含めますか? Tom Ryderが述べた議論の定義によると、Bashクイックスタートガイド(ISBN 978-1-78953-408-5、21ページ)、メタ文字は引数を区別します(少なくとも空白の場合)、bashスクリプトでは、例えばIのように左右の角かっこが使用されていることがわかります。言ったように、彼らは買収の一部です。 。たとえば、次のスクリプトは次のようになりますNUMBER='^[0-9]+$'

ベストアンサー1

私の考えでは、「メタ文字」はやや曖昧な用語です。

Bashのマニュアルページは厳密な意味を提供します。

メタ文字:引用符で囲まれていない単語を区切るために使用される文字。次のいずれか:| & ; ( ) < >スペースタブの改行」

したがって、シェルで実行されたコマンドに渡された引数を意味する場合、定義に基づいて答えはむしろ「いいえ」です。

一方、他の特殊文字にも使用される場合があります。グローバル文字(たとえば[]*?)などの{}!#$特定の項目が含まれている場合、答えはおそらく「時々」です。


特に、POSIXに似たシェルでは、デフォルトでglobパターンと一致するファイルがない場合、ls blahblah?*[123].txt呼び出しは引数で行われますlsblahblah?*[123].txt(存在する場合はその名前が拡張されます。zshとcshは、特に要求しない限り不平を言います。)そして、whileを{サポートするシェルで中括弧の拡張を開始します。単語の残りの部分も中括弧構文に準拠している場合にのみ、特殊な拡張のみが可能です。 。ls {単一のパラメータのみが渡されますが、{2つのパラメータがls foo{a,b}渡されますfooafoobそして、$それ以降に何が起こるかに応じて、いくつかの拡張が実行されたり、実行されたりしない場合があります。echo foo$印刷がfoo$エラーecho foo<が発生します。

ここで重要なのは、これが|&;()<>シェルの語彙アナライザに特別であるため、コマンドライン処理の最初に認識され、コマンド*?[]$ラインが最初に単語に分割された後にのみ認識されることです。!そして、#いくつかは(記録拡張と説明が有効になっている場合)より早く認識されるため、より特別です。しかし、これは語彙分析ステップに影響を与えないため、同じ意味のメタ文字ではありません。echo foo! foo#印刷foo! foo#

それ[[? blah blah blahのように奇妙に見えるキーワードだけですifwhileまたは{。 (try type if、、、type {type [[)内部解析に影響を与えるキーワードですが、メタ文字で構成されていないまま出力さecho [[れます[[。と比較してみてください。((どこにecho ((エラーがありますか? (type ((うまくいかず、type "(("役に立つものを提供していません)

しかし、シェルの構文に深すぎるのが役に立つかどうかはわかりません。複雑でやや奇妙な味があります。また、上記の用語やその他の内容で間違いを犯した可能性があります。

おすすめ記事