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
afile
2つのファイルとabfile
シェル変数を作成しますavar
。
grep 'a' afile
減らす:
a
aa
aaa
grep "a" afile
減らす:
a
aa
aaa
(同じ)。したがってgrep "$avar" afile
、変数を拡張すると、結果は次のようになります。avar
a
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}::