二重引用符付きのgrep、一重引用符、または二重引用符なしのgrepの違い

二重引用符付きのgrep、一重引用符、または二重引用符なしのgrepの違い

grepコマンドを使用して、二重引用符、一重引用符、または引用符のない文字を見つけることの違いが何であるかを知りたいです。

grep ^'\' foo

grep ^"\" foo

grep \ foo

答え1

実際に引用符の外に使用して\入れると悪い例になります^

引用符の動作(または不在)は、一般的な経験則に従って決定されるのでbashはなく、使用中のシェルによって決まります。grep

"  double quotes      Shell variables between the quotes are expanded
'  single quote       Shell variables do not get expanded
   no quotes          you can only use a single word, unless you escape the spaces.

したがって、シェルは最初にいくつかの解釈を実行してから引数をgrep

それでは、いくつかの例を挙げてみましょう。

cat >afile <<EOF
a
aa
aaa
EOF
cat > abfile <<EOF
a
b
ab
aba
EOF
avar=a

afile2つのファイルとabfileシェル変数を作成しますavar

grep 'a' afile減らす:

a
aa
aaa

grep "a" afile減らす:

a
aa
aaa

(同じ)。したがってgrep "$avar" afile、変数を拡張すると、結果は次のようになります。avara

a
aa
aaa

ただし、grep '$avar' afile変数は拡張されないため、avar結果は次のようになります。

(空)

例では、引用符なしでabファイルが生成されます。今、理由を理解する必要があります。

avar='a abfile'
grep $avar

以下を提供します。

a
ab
aba

もちろん、一重引用符を見つけるには一重引用符を見つける必要があり、grep "'"その逆も同様です。

答え2

一緒にリンクされた引用符付き文字列で構成されるすべてのシェル「単語」は、まだ単一の引数です。したがって、他の規則を使用して議論することができます。

Paul--) Q='One Two'
Paul--) J=A'${Q}'B"${Q}"C
Paul--) echo ::"${J}"::
::A${Q}BOne TwoC::
Paul--) echo ::${J}{Foo,Bar}::
::A${Q}BOne TwoCFoo:: ::A${Q}BOne TwoCBar::
Paul--) echo ::"${J}{Foo,Bar}"::
::A${Q}BOne TwoC{Foo,Bar}::

関連情報