web-dev-qa-db-ja.com

grepでシングルクォート、ダブルクォートを使用する場合

ファイル内で「hello」という単純なパターンを検索しようとすると、次の形式のgrepがすべて機能します。

  • grep hello file1
  • grep 'hello' file1
  • grep "hello" file1

上記のフォームのいずれかが機能し、他のフォームが機能しない特定のケースはありますか?別のものを代わりに使用しても違いはありますか?

20

これは実際にはシェルに依存しています。引用(どちらの種類でも)は、主に空白を処理するためのものです。たとえば、次のとおりです。

grep hello world file1

「world」と「file1」というファイルで「hello」という単語を検索しますが、

grep "hello world" file1

file1で「hello world」を探します。

一重引用符と二重引用符のどちらを選択するかは、評価することが予想される変数またはその他の項目が検索文字列に含まれている場合にのみ重要です。一重引用符を使用すると、文字列は文字どおりに解釈され、展開は行われません。二重引用符を使用すると、変数が展開されます。たとえば(BashやZSHなどのBourne派生シェルを使用):

VAR="serverfault"
grep '$VAR' file1
grep "$VAR" file1

最初のgrepは、file1でリテラル文字列 "$ VAR1"を探します。 2番目は「$ VAR」変数を展開し、file1で文字列「serverfault」を探します。

25

ジェームズは正しいですが、さらにデータを追加するには、コマンドの引数として考えるのが最良の方法だと思います。「hello」と「world」を2つの引数にするか、「hello world」を1つにするか引数。

また、二重引用符を使用すると、単なる変数以外の解釈も可能になります。正確にはシェルに依存しますが、履歴の展開、中括弧の展開、ファイル名の展開を確認してください。

また、単一の引数で両方のタイプの引用符を使用する必要がある場合があることに注意することも重要です。 (デフォルトでは)引数は空白で区切られているため、スペースを残さない場合でも同じ引数を指定していることに注意してください。

ほとんどのシェルの単一引用符メカニズムでは、特殊文字を使用できません。つまり、別の単一引用符のインスタンスは、エスケープされているように見えても、引用符を終了します。したがって、単一引用符で囲まれた文字列の中に単一引用符が含まれる文字列を渡すことは不可能であり、二重引用符を使用する必要があります。一重引用符と解釈されるものを含む引数を渡したいが、そうしたくない場合、これは面倒なことがあります。たとえば、リテラル文字列「 `'$ VAR' is a variable」を渡したい場合は、次のようにする必要があります。

"'"'$VAR'"' is a variable"

これは実際には、引用符でエスケープされた3つの文字列を連結したものです。

"'"
'$VAR'
"' is a variable"

または、引用符を削除して:

'
$VAR
' is a variable

実際、ほとんどのシェルでは、次のように行うこともできます。

"'\$VAR' is a variable"

バックスラッシュ( "\ ")は、次の文字を文字どおりに受け入れ、展開しないようにシェルに指示します。

しかし、いくつかの例では、複数の文字列を連結する方法をとる必要があります。実際に今の例を考え出すことはできません。

7
wfaulk