GNU/Linux >> Linux の 問題 >  >> Linux

Unixシェルで特殊文字を通常の文字として使用するにはどうすればよいですか?

「二重引用符(“)?」のような多くの質問が寄せられており、同じ答えでコミュニティを乱雑にしたくありません( "と入力してください 'で囲まれていない場合 s、 " 'で囲まれている場合 s。)それで、質問はここにあります。

通常の文字のように、端末に特殊文字を入力することはできません。このコマンドは失敗します:

echo Updates (11)

では、これらの文字を通常の文字であるかのようにターミナルに入力するにはどうすればよいですか?

!#$^&*?[](){}<>~;'"|<space><tab><newline>

承認された回答:

それはシェルに大きく依存します。詳細については、シェルのマニュアルを確認してください。

また、一部の文字は一部のコンテキストでのみ特別であることに注意してください。たとえば、ほとんどのシェルでは、 * および リストコンテキストでのみ特別です。
POSIXまたはcshのようなシェルでは 単語の先頭またはのようないくつかの文字の後にのみ特別です 。 =についても同じ zshで 。一部のシェルでは、 [ ] と(いくつかの制限付きで)一致した場合にのみ特別です 。

bashのようないくつかのシェルでは またはyash 、空白のトークン区切り文字などの特殊文字もロケールによって異なります。

引用演算子(これらの文字の特別な意味を削除するため)もシェル間で大きく異なります。

ボーンのようなシェル

ボーンのようなシェル(つまり、 sh と呼ばれることが知られているシェル)の概要 80年代以降のシステムで):

ボーンシェル

特殊文字:

  • "'&|;()^` <> $ 、スペース、改行、タブは、引用符で囲まれていない場合、単純なコマンドラインでは特別です。
  • (初期バージョンを除く)行の先頭、または引用符で囲まれていないスペース、タブ、または&|()^ <>;`の後に特別なものがあります 。
  • { および} シェルキーワードであるという点でのみ特別です(したがって、コマンド位置にある単語のみ)。
  • *?[ グロビング演算子として特別であるため、リストコンテキストでのみ使用できます。 [の場合 、 [...] これは、[のいずれかのグロビング演算子です。 または] 特別な意味を取り除くために引用する必要があるだけです。
  • = 代入演算子として扱われるコンテキストでは特別です。つまり、単純なコマンドでは、引数に従わないすべての単語に対して( set -k の後を除く) 。

引用演算子

  • 改行( )を除くすべての特殊文字を引用符で囲みます 長い論理的を継続する方法です 次の物理的に線を引く 行、シーケンスが削除されるように)。バックティックは、バックティック内のようにさらに複雑になることに注意してください、 クロージングバックティックを回避し、パーサーを支援するために最初に使用されます。二重引用符で囲まれた 自分自身をエスケープするためにのみ使用できます、 " $ および` まだ行継続です)。ヒアドキュメント内、"を除いて同じ 。 ヒアドキュメント内の文字をエスケープする唯一の方法です。
  • "..." 二重引用符は、それ自体を除くすべての文字をエスケープします。 $ および`
  • '...' 一重引用符は、それ自体を除くすべての文字をエスケープします。

POSIXシェル

POSIXシェルは、次の点を除いて、ほとんどBourneシェルと同じように動作します。

  • ^ もはや特殊文字ではありません
  • 一部のコンテキストでは特別です
  • { 特別であることが許可されているので、引用する必要があります。

ksh

POSIXと同様ですが、次の点が異なります。

  • {string} 文字列に引用符で囲まれていないが含まれている場合は特別です (または .. 場合によっては、バージョンによっても)
  • ksh93には、追加の特別な引用演算子があります: $'...' 複雑なルールで。その演算子は、 bash にも(いくつかのバリエーションがありますが)見つかります 、 zsh mksh およびFreeBSDとbusyboxsh
  • ksh93 $ "..."もあります "..."のように機能する引用演算子 ただし、文字列はローカリゼーションの対象になります(ユーザーの言語に翻訳されるように構成できます)。 mksh $を無視します $ "..."で 。
  • ksh93r以降 、 ksh93 -H でcshスタイル(デフォルトでは有効になっていません)をサポートします / -o histexpand インタラクティブシェルで) ^を作成します コマンドの先頭と 特別。 その場合、一部のコンテキストでは特別であり(スペースやTABが続く場合や、ヒアドキュメントではありません)、二重引用符でエスケープされません。バックスラッシュ(二重引用符で囲まれていない)と一重引用符のみがそれをエスケープします。

bash

ksh93のように しかし:

  • シングルバイト文字ロケールでは、すべて空白 (ロケールに応じて)文字は区切り文字(スペースやタブなど)と見なされます。つまり、一部のロケールで空白文字になる可能性がある場合に備えて、8番目のビットが設定されたすべてのバイトを引用符で囲む必要があります。
  • csh履歴拡張は、インタラクティブインスタンスでデフォルトで有効になっていますが、 bash の新しいバージョンを除いて、上記のksh93と同じ注意事項があります。 、 "が続く場合も、特別ではない場合があります 。

zsh

ksh93のように しかし:

  • bashと同じメモ csh履歴拡張用
  • = 単語の最初の文字として特別です( =ls / bin / lsに展開されます 。
  • { および} 区切られていない場合は、コマンドグループを開いたり閉じたりすることもできます( {echo text} のように) ボーンの{echotext;}のように機能します 。
  • [を除く 単独で、 [ ] で閉じていなくても、引用符で囲む必要があります 。
  • extendedglobを使用 オプションが有効、 ^ および グロビング演算子です。
  • bracecclを使用 オプション、 {non-empty-string} 特別です。
  • $ "..." サポートされていません。
  • 特別な癖として、 をフォローする場合は特別ではありません 単語の先頭(%?name を許可するため) 職務仕様書)
  • rcquotes オプション(デフォルトでは有効になっていません)を使用すると、一重引用符を''として入力できます。 一重引用符の内側àlarc (以下を参照)。
関連:LVMはパフォーマンスに影響を与えますか?

ヤシュ

POSIXのように それ以外。

  • すべての空白文字は区切り文字と見なされます。
  • brace-expandを使用 オプション、zshスタイルのブレース拡張を実装します。

すべてのシェルについて、引用が異なる動作をするいくつかの特別なコンテキストがあります。ここでドキュメントとバックティックについてはすでに説明しましたが、 [[...]]もあります。 kshおよびその他のいくつかのシェルでは、POSIX $((...)) case コンストラクト…

また、拡張(二重引用符を使用)に関して、またはヒアドキュメント区切り文字に適用した場合、引用符は他の副作用をもたらす可能性があることに注意してください。また、予約語を無効にし、エイリアスの拡張に影響を与えます。

概要

ボーンのようなシェルでは、!#$ ^&*?[(){} <>〜;'"` | = 、SPC、TAB、NEWLINE、および8番目のビットが設定された一部のバイトは(少なくとも一部のコンテキストでは)特殊であるか、特殊である可能性があります。

文字通りに扱われるように特別な意味を取り除くには、引用符を使用します。

使用:

  • '...' すべての文字の特別な意味を削除するには:

    printf '%sn' '// Those $quoted$ strings are passed literally as
    single arguments (without the enclosing quotes) to `printf`'
    
  • 1文字のみの特別な意味を削除するには:

    printf '<%s>n' foo bar baz #comment
    

    上記では、が前に付いたスペース文字のみ 文字通りprintfに渡されます 。他のものは、シェルによってトークン区切り文字として扱われます。

  • "..."を使用します パラメータ拡張を許可しながら文字を引用する( $ var $# $ {foo#bar} …)、算術展開( $((1 + 1)) $ [1 + 1] 一部のシェルでは)およびコマンド置換 $(...) または古い形式の`...` 。実際、ほとんどの場合、これらの展開はどのような場合でも二重引用符で囲みます。 を使用できます "..."内 まだ特別な文字の特別な意味を削除します(ただし、それらだけです)。

  • 文字列に'が含まれている場合 文字、引き続き'...'を使用できます 残りの部分については、'を引用できる他の引用メカニズムを使用します "'"のように または' または(利用可能な場合) $'''

    echo 'This is "tricky", isn'''t it?'
    
  • 最新の$(...)を使用する コマンド置換の形式。古い`...`のみを使用してください Bourneシェルとの互換性のため、つまり非常に古いシステムとの互換性のため、使用しない場合のように変数の割り当てのみ:

    echo "`echo "foo bar"`"
    

    これは、BourneシェルまたはAT&Tバージョンのkshでは機能しません。または:

    echo "`echo "foo bar"`"
    

    これはBourneとAT&T kshで機能しますが、 yashでは機能しません ( 2020編集: ただし、バージョン2.41以前でのみ、2.​​42 /バグレポート/コミットで変更されていますが、次を使用してください:

    var=`echo "foo bar"`; echo "$var"
    

    これはすべてで機能します。

    二重引用符で移植可能にネストすることも不可能なので、ここでも変数を使用します。また、特別なバックスラッシュ処理にも注意してください:

    var=`printf '%sn' '\'`
    

    $ var内にバックスラッシュを1つだけ格納します 、バックスラッシュ処理のレベルが追加されているため( の場合) 、`、および $ (および " yash以外で引用された場合 ))バックティック内なので、どちらかが必要です

    var=`printf '%sn' '\\'`
    

    または

    var=`printf '%sn' '\'
    

    代わりに。

Cshファミリー

cshとtcshの構文は大きく異なりますが、共通の遺産を共有しているため、Bourneシェルとの共通点はまだたくさんあります。

特殊文字:

  • "'&|;()^` <> $ 、スペース、改行、タブは、引用されていない場合はどこでも特別です。
  • (cshはを導入したシェルです コメントリーダーとして)は、スクリプトの先頭、または引用符で囲まれていないスペース、タブ、または改行の後に特別です。
  • *?[ グロビング演算子としては特別なので、リストコンテキストでは
  • {non-empty-string} 特別です(cshはブレース拡張を導入したシェルです)。
  • および^ 履歴拡張の一部として特別であり(これもcshの発明です)、引用規則は特別です。
  • (チルダ拡張もcshの発明です)一部のコンテキストでは特別です。

引用演算子

これらはBourneシェルの場合と同じですが、動作が異なります。 tcshは、構文の観点からはcshのように動作しますが、cshの多くのバージョンには厄介なバグがあることがわかります。最新バージョンのtcshを入手して、大まかに機能するバージョンのcshを入手してください。

  • 改行を除く単一の文字をエスケープします(Bourneシェルの場合と同じ)。 をエスケープできる唯一の引用演算子です。 。 エスケープしませんが、コマンドセパレータからトークンセパレータ(スペースなど)に変換します
  • "..." $自体を除くすべての文字をエスケープします 、 ` 、改行、 。 Bourneシェルとは異なり、は使用できません。 $をエスケープするには および` "..."内 、ただし、を使用できます をエスケープするには または改行(ただし、の前を除いてそれ自体ではありません または改行)。リテラルの "!"です とリテラル "\!"です 。
  • '...' 自体を除くすべての文字をエスケープします と改行。二重引用符の場合と同様に、 改行はバックスラッシュでエスケープできます。
  • コマンド置換は`...`を介してのみ行われます 構文であり、確実に使用することはほとんどできません。
  • 変数の置換もかなりひどく設計されており、エラーが発生しやすくなっています。 $ var:q 演算子は、変数を含むより信頼性の高いコードを書くのに役立ちます。
関連:ExcelのGoogleスプレッドシートの特殊操作の貼り付けはどこにありますか?

概要

可能であれば、cshに近づかないでください。使用できない場合:

  • ほとんどの文字を引用する一重引用符。 改行にはまだが必要です 。
  • ほとんどの文字をエスケープできます
  • "..." いくつかの拡張を許可できますが、改行やバックスラッシュ文字を埋め込む場合はかなりバグがあります。一重引用符と $ var:qのみを使用するのが最適です。 可変拡張用。配列の要素を確実に結合する場合は、ループを使用する必要があります。

rc 家族

rc plan9です シェルとその子孫のようにes およびakanga Unixおよびunixのようなものに移植されました。これは、はるかにクリーンで優れた構文を備えたシェルであり、下位互換性のためにBourneのようなシェルに固執していなければ誰もが使用するシェルです。

rc /アカンガ

特殊文字

  • #;&| ^ $ =`'{}()<> 、SPC、TAB、およびNEWLINEは、引用符で囲まれていない場合は常に特別です。
  • *?[ グロビング演算子です。

引用演算子

'...' 唯一の引用演算子です。散らかった' ''で書かれています 次のように一重引用符で囲みます:

echo 'it''s so simple isn''t it?'

es

es 実験的と見なすことができます rcに基づくシェル 。

ただし、いくつかの違いがあります。このQ/Aで興味深いのは、です。 は引用符演算子(改行を除くすべての特殊文字を引用符で囲む)でもあり、 nなどのエスケープシーケンスを導入するためにも使用できます。 改行の場合、 b バックスラッシュの場合…

fishは比較的新参者であり(2005年頃)、主にインタラクティブな使用を目的としており、他のシェルとは構文が大幅に異なります。

特殊文字

  • "'()$%{} ^ <>;&| 引用されていない場合は常に特別です(に注意してください) (pid拡張用)他のシェルとの大きな違いとして、および ` 特別ではありません)
  • (コメント)引用符で囲まれていないスペース、タブ、改行、または;&| ^ <>をフォローする場合は特別
  • *? (ただし、 [...]ではありません )グロビング演算子

引用演算子

  • 改行を除く単一の特殊文字を引用しますが、Cエスケープシーケンス( n )としても機能することに注意してください。 、 b …)紹介者。 IOW、 n 引用符で囲まれていないn しかし、改行です。
  • "..." それ自体以外のすべてを引用します、 $ そして、バックスラッシュとバックスラッシュを使用してそれらをエスケープすることができます。 "..." 内の行の継続(削除)です 。
  • '...' それ自体と以外のすべてを引用します 、バックスラッシュを使用してそれらをエスケープできます。

Linux
  1. Unixシステムの文字特殊ファイルとブロック特殊ファイルとは何ですか?

  2. UNIX / Linux:ディレクトリとファイルでスティッキー ビットを使用する方法

  3. Linux で netstat コマンドを使用する方法 (例を含む)

  1. Linux でシェル トークンを生成するためにシェル拡張を使用する方法

  2. vimでpylintを使用する方法

  3. Linux / Unixで複数のファイルの名前をある拡張子から別の拡張子に変更する方法は?

  1. dos2unix の使い方

  2. 文字列に特殊文字が含まれているかどうかを確認する方法 ([email protected]#$%^&*()_+)

  3. 先読みを使用して正規表現で特殊文字を除外する方法